From ed9fd3adf7e27bebfb6620d832fae14579593f78 Mon Sep 17 00:00:00 2001 From: Jochen Berger Date: Tue, 15 Aug 2017 09:03:53 +0200 Subject: [PATCH] convert lists and maps for ValueNode (fixes #378) --- .../jsonpath/internal/filter/ValueNode.java | 12 ++++---- .../com/jayway/jsonpath/old/IssuesTest.java | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java index 5135f848..d1619c45 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java @@ -359,19 +359,19 @@ public abstract class ValueNode { } public boolean isArray(Predicate.PredicateContext ctx) { - return ctx.configuration().jsonProvider().isArray(parse(ctx)); + return parse(ctx) instanceof List; } public boolean isMap(Predicate.PredicateContext ctx) { - return ctx.configuration().jsonProvider().isMap(parse(ctx)); + return parse(ctx) instanceof Map; } public int length(Predicate.PredicateContext ctx) { - return isArray(ctx) ? ctx.configuration().jsonProvider().length(parse(ctx)) : -1; + return isArray(ctx) ? ((List) parse(ctx)).size() : -1; } public boolean isEmpty(Predicate.PredicateContext ctx) { - if (isArray(ctx) || isMap(ctx)) return ctx.configuration().jsonProvider().length(parse(ctx)) == 0; + if (isArray(ctx) || isMap(ctx)) return ((Collection) parse(ctx)).size() == 0; else if((parse(ctx) instanceof String)) return ((String)parse(ctx)).length() == 0; return true; } @@ -844,8 +844,8 @@ public abstract class ValueNode { else if (res instanceof String) return ValueNode.createStringNode(res.toString(), false); else if (res instanceof Boolean) return ValueNode.createBooleanNode(res.toString()); else if (res == null) return ValueNode.NULL_NODE; - else if (ctx.configuration().jsonProvider().isArray(res)) return ValueNode.createJsonNode(res); - else if (ctx.configuration().jsonProvider().isMap(res)) return ValueNode.createJsonNode(res); + else if (ctx.configuration().jsonProvider().isArray(res)) return ValueNode.createJsonNode(ctx.configuration().mappingProvider().map(res, List.class, ctx.configuration())); + else if (ctx.configuration().jsonProvider().isMap(res)) return ValueNode.createJsonNode(ctx.configuration().mappingProvider().map(res, Map.class, ctx.configuration())); else throw new JsonPathException("Could not convert " + res.toString() + " to a ValueNode"); } catch (PathNotFoundException e) { return ValueNode.UNDEFINED; diff --git a/json-path/src/test/java/com/jayway/jsonpath/old/IssuesTest.java b/json-path/src/test/java/com/jayway/jsonpath/old/IssuesTest.java index 04ffa00f..d66313bb 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/old/IssuesTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/old/IssuesTest.java @@ -13,8 +13,10 @@ import com.jayway.jsonpath.PathNotFoundException; import com.jayway.jsonpath.internal.Utils; import com.jayway.jsonpath.spi.cache.LRUCache; import com.jayway.jsonpath.spi.json.GsonJsonProvider; +import com.jayway.jsonpath.spi.json.JacksonJsonNodeJsonProvider; import com.jayway.jsonpath.spi.json.JsonProvider; import com.jayway.jsonpath.spi.mapper.GsonMappingProvider; +import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider; import com.jayway.jsonpath.spi.mapper.MappingException; import net.minidev.json.JSONAware; import net.minidev.json.parser.JSONParser; @@ -1019,4 +1021,30 @@ public class IssuesTest extends BaseTest { assertThat(doc.read("$.jsonArr[0].name")).isEqualTo("nOne"); assertThat(doc.read("$.jsonArr[1].name")).isEqualTo("Jayway"); } + + @Test + public void issue_378(){ + + String json = "{\n" + + " \"nodes\": {\n" + + " \"unnamed1\": {\n" + + " \"ntpServers\": [\n" + + " \"1.2.3.4\"\n" + + " ]\n" + + " }\n" + + " }\n" + + "}"; + + Configuration configuration = Configuration.builder() + .jsonProvider(new JacksonJsonNodeJsonProvider()) + .mappingProvider(new JacksonMappingProvider()) + .build(); + + DocumentContext ctx = JsonPath.using(configuration).parse(json); + + String path = "$.nodes[*][?(!([\"1.2.3.4\"] subsetof @.ntpServers))].ntpServers"; + JsonPath jsonPath = JsonPath.compile(path); + + ctx.read(jsonPath); + } }