diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FieldFilter.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FieldFilter.java index 9c1e0678..13a5998f 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FieldFilter.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FieldFilter.java @@ -40,25 +40,55 @@ public class FieldFilter extends PathTokenFilter { List result = jsonProvider.createList(); for (Object current : jsonProvider.toList(obj)) { if (jsonProvider.isMap(current)) { + Map map = jsonProvider.toMap(current); - if (map.containsKey(condition)) { - Object o = map.get(condition); - if (jsonProvider.isList(o)) { - result.addAll(jsonProvider.toList(o)); - } else { - result.add(map.get(condition)); + + String[] split = condition.split("','"); + if(split.length == 1){ + if (map.containsKey(condition)) { + Object o = map.get(condition); + if (jsonProvider.isList(o)) { + result.addAll(jsonProvider.toList(o)); + } else { + result.add(map.get(condition)); + } + } + } else { + Map res = jsonProvider.createMap(); + for (String prop : split) { + if (map.containsKey(prop)) { + res.put(prop, map.get(prop)); + } } + result.add(res); } } } return result; } } else { + String[] split = condition.split("','"); + Map map = jsonProvider.toMap(obj); - if(!map.containsKey(condition)){ + if(!map.containsKey(condition) && split.length == 1){ throw new InvalidPathException("invalid path"); } else { - return map.get(condition); + + if(split.length == 1){ + return map.get(condition); + } else { + Map res = jsonProvider.createMap(); + for (String prop : split) { + if(map.containsKey(prop)){ + res.put(prop, map.get(prop)); + } else { + throw new InvalidPathException("invalid path"); + } + } + return res; + } + + } } } diff --git a/json-path/src/test/java/com/jayway/jsonpath/HelpTest.java b/json-path/src/test/java/com/jayway/jsonpath/HelpTest.java new file mode 100644 index 00000000..36738fe0 --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/HelpTest.java @@ -0,0 +1,102 @@ +package com.jayway.jsonpath; + +import org.junit.Test; + +import java.util.List; + +import static org.hamcrest.Matchers.hasItems; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +public class HelpTest { + + public static final String JSON = "{\n" + + " \"destination_addresses\" : [\n" + + " \"Rua do Dom António José Cordeiro 48, 3800-012 Aveiro, Portugal\",\n" + + " \"Rua do Dom António José Cordeiro 48, 3800-012 Aveiro, Portugal\"\n" + + " ],\n" + + " \"origin_addresses\" : [ \"N109, 3800, Portugal\" ],\n" + + " \"rows\" : [\n" + + " {\n" + + " \"elements\" : [\n" + + " {\n" + + " \"distance\" : {\n" + + " \"text\" : \"0.4 km\",\n" + + " \"value\" : 427\n" + + " },\n" + + " \"duration\" : {\n" + + " \"text\" : \"1 min\",\n" + + " \"value\" : 58\n" + + " },\n" + + " \"status\" : \"OK\"\n" + + " },\n" + + " {\n" + + " \"distance\" : {\n" + + " \"text\" : \"5.0 km\",\n" + + " \"value\" : 427\n" + + " },\n" + + " \"duration\" : {\n" + + " \"text\" : \"1 min\",\n" + + " \"value\" : 58\n" + + " },\n" + + " \"status\" : \"OK\"\n" + + " }\n" + + " ]\n" + + " }\n" + + " ],\n" + + " \"status\" : \"OK\"\n" + + "}"; + + private static final String JSON2 = "{\n" + + " \"error\": null,\n" + + " \"contents\": [\n" + + " {\n" + + " \"groupType\": \"series\",\n" + + " \"instanceId\": \"grp://15\",\n" + + " \"id\": \"prg://16\",\n" + + " \"type\": \"group\",\n" + + " \"media\": [\n" + + " {\n" + + " \"classification\": \"urn:1.2.3\",\n" + + " \"uri\": \"http://yahoo.com/1.png\",\n" + + " \"mimeType\": \"application/octet-stream\"\n" + + " }\n" + + " ]\n" + + " }\n" + + " ],\n" + + " \"header\": {\n" + + " \"total\": 1\n" + + " }\n" + + "}"; + + + @Test + public void sample_one_x(){ + System.out.println(JsonPath.read(JSON2, "$.['error', 'header']")); + System.out.println(JsonPath.read(JSON2, "$.contents[*].['groupType', 'type']")); + } + + @Test + public void sample_one(){ + List addresses = JsonPath.read(JSON, "$.destination_addresses[*]"); + assertThat(addresses, hasItems("Rua do Dom António José Cordeiro 48, 3800-012 Aveiro, Portugal")); + } + + @Test + public void sample_two(){ + String text = JsonPath.read(JSON, "$.rows[0].elements[1].distance.text"); + assertEquals("5.0 km", text); + } + + @Test + public void sample_two_b(){ + String text = JsonPath.read(JSON, "$.rows[0].elements[1].distance.text"); + assertEquals("5.0 km", text); + } + + @Test + public void sample_three(){ + List allDistanceTexts = JsonPath.read(JSON, "$.rows[0].elements[*].distance.text"); + assertThat(allDistanceTexts, hasItems("0.4 km", "5.0 km")); + } +} diff --git a/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java b/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java index c9f360b2..20e4fd5b 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java @@ -40,4 +40,6 @@ public class IssuesTest { assertTrue(result.isEmpty()); } + + } diff --git a/json-path/src/test/java/com/jayway/jsonpath/JsonModelChainedCallsTest.java b/json-path/src/test/java/com/jayway/jsonpath/JsonModelChainedCallsTest.java index a7f653c9..93362f09 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/JsonModelChainedCallsTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonModelChainedCallsTest.java @@ -58,7 +58,6 @@ public class JsonModelChainedCallsTest { JsonModel model = JsonModel.model(DOCUMENT); Transformer> transformer = new Transformer>() { - @Override public Object transform(Map map) { map.remove("isbn"); map.put("author", "kalle"); @@ -78,7 +77,6 @@ public class JsonModelChainedCallsTest { JsonModel model = JsonModel.model(DOCUMENT); Transformer transformer = new Transformer() { - @Override public Object transform(Object obj) { Map map = (Map) obj; map.remove("isbn"); diff --git a/json-path/src/test/java/com/jayway/jsonpath/JsonPathFilterTest.java b/json-path/src/test/java/com/jayway/jsonpath/JsonPathFilterTest.java index 48e9b312..04e22ec6 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/JsonPathFilterTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonPathFilterTest.java @@ -101,6 +101,10 @@ public class JsonPathFilterTest { Filter rootChildFilter = filter(where("name").regex(Pattern.compile("rootChild_[A|B]"))); Filter rootGrandChildFilter = filter(where("name").regex(Pattern.compile("rootGrandChild_[A|B]"))); + + + + List read = JsonPath.read(root, "children[?].children[?][?]", rootChildFilter, rootGrandChildFilter, customFilter); diff --git a/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java b/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java index 5f6c6786..e5e47a11 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java @@ -72,7 +72,6 @@ public class JsonPathTest { private final static String ARRAY_EXPAND = "[{\"parent\": \"ONE\", \"child\": {\"name\": \"NAME_ONE\"}}, [{\"parent\": \"TWO\", \"child\": {\"name\": \"NAME_TWO\"}}]]"; - @Test public void array_start_expands() throws Exception { //assertThat(JsonPath.>read(ARRAY_EXPAND, "$[?(@.parent = 'ONE')].child.name"), hasItems("NAME_ONE")); diff --git a/json-path/src/test/java/com/jayway/jsonpath/PathTest.java b/json-path/src/test/java/com/jayway/jsonpath/PathTest.java index 23b4cf64..ab75cbe1 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/PathTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/PathTest.java @@ -111,6 +111,15 @@ public class PathTest { assertPathInvalid("$...*"); } + @Test + public void multi_field_select(){ + PathTokenizer tokenizer = new PathTokenizer("$.contents[*].['groupType', 'type']"); + for (String fragment : tokenizer.getFragments()) { + System.out.println(fragment); + } + + } + //---------------------------------------------------------------- // diff --git a/pom.xml b/pom.xml index e2780124..e3c9bb00 100644 --- a/pom.xml +++ b/pom.xml @@ -112,8 +112,8 @@ maven-compiler-plugin 2.3.2 - 1.5 - 1.5 + 1.6 + 1.6