From 6ba0716f1a47586057c836a0253f4c531cc2e72e Mon Sep 17 00:00:00 2001 From: CindyChow123 Date: Sun, 16 May 2021 14:35:07 +0800 Subject: [PATCH 1/3] fix bug 612 --- .../java/com/jayway/jsonpath/JsonPath.java | 28 +++++++++++++--- .../jsonpath/internal/function/Issue612.java | 33 +++++++++++++++++++ 2 files changed, 57 insertions(+), 4 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 bcbd3c8b8..3c735db3b 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java +++ b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java @@ -237,11 +237,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/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..4393159bf --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/internal/function/Issue612.java @@ -0,0 +1,33 @@ +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)); + try { + documentContext.map(query, (object, configuration) -> object); + } catch (Exception e) { + fail("got exception: " + e); + } + } +} From 5702608346d5cd63670d78b1a4927f6f1b924880 Mon Sep 17 00:00:00 2001 From: CindyChow123 Date: Sun, 16 May 2021 14:47:25 +0800 Subject: [PATCH 2/3] modify fix bug 612 --- .../main/java/com/jayway/jsonpath/internal/JsonContext.java | 4 ++-- .../java/com/jayway/jsonpath/internal/function/Issue612.java | 5 ----- 2 files changed, 2 insertions(+), 7 deletions(-) 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 index 4393159bf..4d622fdf0 100644 --- 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 @@ -24,10 +24,5 @@ public void test() { JsonPath query = JsonPath.compile("$.1.2.a.b.c"); Assert.assertNull(documentContext.read(query)); Assert.assertNull(documentContext.map(query, (object, configuration) -> object)); - try { - documentContext.map(query, (object, configuration) -> object); - } catch (Exception e) { - fail("got exception: " + e); - } } } From 831454d10b8a6994b23016bf53e89a6e88c5d868 Mon Sep 17 00:00:00 2001 From: CindyChow123 Date: Sun, 16 May 2021 14:51:34 +0800 Subject: [PATCH 3/3] modify fix bug 612, add one more testcase --- .../com/jayway/jsonpath/internal/function/Issue612.java | 9 +++++++++ 1 file changed, 9 insertions(+) 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 index 4d622fdf0..2118a812c 100644 --- 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 @@ -25,4 +25,13 @@ public void test() { 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); + } }