Skip to content

Commit ed9fd3a

Browse files
committed
convert lists and maps for ValueNode (fixes json-path#378)
1 parent efdab97 commit ed9fd3a

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -359,19 +359,19 @@ public Object getJson() {
359359
}
360360

361361
public boolean isArray(Predicate.PredicateContext ctx) {
362-
return ctx.configuration().jsonProvider().isArray(parse(ctx));
362+
return parse(ctx) instanceof List;
363363
}
364364

365365
public boolean isMap(Predicate.PredicateContext ctx) {
366-
return ctx.configuration().jsonProvider().isMap(parse(ctx));
366+
return parse(ctx) instanceof Map;
367367
}
368368

369369
public int length(Predicate.PredicateContext ctx) {
370-
return isArray(ctx) ? ctx.configuration().jsonProvider().length(parse(ctx)) : -1;
370+
return isArray(ctx) ? ((List<?>) parse(ctx)).size() : -1;
371371
}
372372

373373
public boolean isEmpty(Predicate.PredicateContext ctx) {
374-
if (isArray(ctx) || isMap(ctx)) return ctx.configuration().jsonProvider().length(parse(ctx)) == 0;
374+
if (isArray(ctx) || isMap(ctx)) return ((Collection<?>) parse(ctx)).size() == 0;
375375
else if((parse(ctx) instanceof String)) return ((String)parse(ctx)).length() == 0;
376376
return true;
377377
}
@@ -844,8 +844,8 @@ public ValueNode evaluate(Predicate.PredicateContext ctx) {
844844
else if (res instanceof String) return ValueNode.createStringNode(res.toString(), false);
845845
else if (res instanceof Boolean) return ValueNode.createBooleanNode(res.toString());
846846
else if (res == null) return ValueNode.NULL_NODE;
847-
else if (ctx.configuration().jsonProvider().isArray(res)) return ValueNode.createJsonNode(res);
848-
else if (ctx.configuration().jsonProvider().isMap(res)) return ValueNode.createJsonNode(res);
847+
else if (ctx.configuration().jsonProvider().isArray(res)) return ValueNode.createJsonNode(ctx.configuration().mappingProvider().map(res, List.class, ctx.configuration()));
848+
else if (ctx.configuration().jsonProvider().isMap(res)) return ValueNode.createJsonNode(ctx.configuration().mappingProvider().map(res, Map.class, ctx.configuration()));
849849
else throw new JsonPathException("Could not convert " + res.toString() + " to a ValueNode");
850850
} catch (PathNotFoundException e) {
851851
return ValueNode.UNDEFINED;

json-path/src/test/java/com/jayway/jsonpath/old/IssuesTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
import com.jayway.jsonpath.internal.Utils;
1414
import com.jayway.jsonpath.spi.cache.LRUCache;
1515
import com.jayway.jsonpath.spi.json.GsonJsonProvider;
16+
import com.jayway.jsonpath.spi.json.JacksonJsonNodeJsonProvider;
1617
import com.jayway.jsonpath.spi.json.JsonProvider;
1718
import com.jayway.jsonpath.spi.mapper.GsonMappingProvider;
19+
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
1820
import com.jayway.jsonpath.spi.mapper.MappingException;
1921
import net.minidev.json.JSONAware;
2022
import net.minidev.json.parser.JSONParser;
@@ -1019,4 +1021,30 @@ public void issue_309(){
10191021
assertThat(doc.read("$.jsonArr[0].name")).isEqualTo("nOne");
10201022
assertThat(doc.read("$.jsonArr[1].name")).isEqualTo("Jayway");
10211023
}
1024+
1025+
@Test
1026+
public void issue_378(){
1027+
1028+
String json = "{\n" +
1029+
" \"nodes\": {\n" +
1030+
" \"unnamed1\": {\n" +
1031+
" \"ntpServers\": [\n" +
1032+
" \"1.2.3.4\"\n" +
1033+
" ]\n" +
1034+
" }\n" +
1035+
" }\n" +
1036+
"}";
1037+
1038+
Configuration configuration = Configuration.builder()
1039+
.jsonProvider(new JacksonJsonNodeJsonProvider())
1040+
.mappingProvider(new JacksonMappingProvider())
1041+
.build();
1042+
1043+
DocumentContext ctx = JsonPath.using(configuration).parse(json);
1044+
1045+
String path = "$.nodes[*][?(!([\"1.2.3.4\"] subsetof @.ntpServers))].ntpServers";
1046+
JsonPath jsonPath = JsonPath.compile(path);
1047+
1048+
ctx.read(jsonPath);
1049+
}
10221050
}

0 commit comments

Comments
 (0)