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 bcbd3c8b..3c735db3 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/main/java/com/jayway/jsonpath/internal/JsonContext.java b/json-path/src/main/java/com/jayway/jsonpath/internal/JsonContext.java index 73147334..9d8d8ee4 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 00000000..2118a812 --- /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); + } +}