From 78a9420b4230c7671b1a67591ebde6295a3c6283 Mon Sep 17 00:00:00 2001 From: Cincronic <47686893+CindyChow123@users.noreply.github.com> Date: Wed, 2 Jun 2021 19:55:39 +0800 Subject: [PATCH] Fix bug 612 and add two testcases (#711) * fix bug 612 * modify fix bug 612 * modify fix bug 612, add one more testcase Co-authored-by: CindyChow123 --- .../java/com/jayway/jsonpath/JsonPath.java | 28 ++++++++++++-- .../jayway/jsonpath/internal/JsonContext.java | 4 +- .../jsonpath/internal/function/Issue612.java | 37 +++++++++++++++++++ 3 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 json-path/src/test/java/com/jayway/jsonpath/internal/function/Issue612.java diff --git a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java index 9fb78b1fe..06c6db3df 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java +++ b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java @@ -239,11 +239,31 @@ public T map(Object jsonObject, MapFunction mapFunction, Configuration confi notNull(jsonObject, "json can not be null"); notNull(configuration, "configuration can not be null"); notNull(mapFunction, "mapFunction can not be null"); - EvaluationContext evaluationContext = path.evaluate(jsonObject, jsonObject, configuration, true); - for (PathRef updateOperation : evaluationContext.updateOperations()) { - updateOperation.convert(mapFunction, configuration); + boolean optAsPathList = configuration.containsOption(AS_PATH_LIST); + boolean optAlwaysReturnList = configuration.containsOption(Option.ALWAYS_RETURN_LIST); + boolean optSuppressExceptions = configuration.containsOption(Option.SUPPRESS_EXCEPTIONS); + try { + EvaluationContext evaluationContext = path.evaluate(jsonObject, jsonObject, configuration, true); + for (PathRef updateOperation : evaluationContext.updateOperations()) { + updateOperation.convert(mapFunction, configuration); + } + return resultByConfiguration(jsonObject, configuration, evaluationContext); + }catch (RuntimeException e) { + if (!optSuppressExceptions) { + throw e; + } else { + if (optAsPathList) { + return (T) configuration.jsonProvider().createArray(); + } else { + if (optAlwaysReturnList) { + return (T) configuration.jsonProvider().createArray(); + } else { + return (T) (path.isDefinite() ? null : configuration.jsonProvider().createArray()); + } + } + } } - return resultByConfiguration(jsonObject, configuration, evaluationContext); + } /** diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/JsonContext.java b/json-path/src/main/java/com/jayway/jsonpath/internal/JsonContext.java index 731473348..9d8d8ee44 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/JsonContext.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/JsonContext.java @@ -146,8 +146,8 @@ public DocumentContext map(String path, MapFunction mapFunction, Predicate... fi @Override public DocumentContext map(JsonPath path, MapFunction mapFunction) { - path.map(json, mapFunction, configuration); - return this; + Object obj = path.map(json, mapFunction, configuration); + return obj==null ? null:this; } @Override diff --git a/json-path/src/test/java/com/jayway/jsonpath/internal/function/Issue612.java b/json-path/src/test/java/com/jayway/jsonpath/internal/function/Issue612.java new file mode 100644 index 000000000..2118a812c --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/internal/function/Issue612.java @@ -0,0 +1,37 @@ +package com.jayway.jsonpath.internal.function; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.jayway.jsonpath.*; +import com.jayway.jsonpath.spi.json.JacksonJsonNodeJsonProvider; +import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider; +import org.junit.Assert; +import org.junit.Test; + +import static com.jayway.jsonpath.JsonPath.using; +import static com.jayway.jsonpath.internal.path.PathCompiler.fail; + +public class Issue612 { + @Test + public void test() { + Configuration config = Configuration.builder() + .options(Option.SUPPRESS_EXCEPTIONS) + .build(); + String json = "{\"1\":{\"2\":null}}"; + DocumentContext documentContext = JsonPath.using(config).parse(json); + JsonPath query = JsonPath.compile("$.1.2.a.b.c"); + Assert.assertNull(documentContext.read(query)); + Assert.assertNull(documentContext.map(query, (object, configuration) -> object)); + } + @Test(expected = Exception.class) + public void test2() { + Configuration config = Configuration.builder() + .build(); + String json = "{\"1\":{\"2\":null}}"; + DocumentContext documentContext = JsonPath.using(config).parse(json); + JsonPath query = JsonPath.compile("$.1.2.a.b.c"); + documentContext.map(query, (object, configuration) -> object); + } +}