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 1dbbd8d9..8dff12ee 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java +++ b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java @@ -11,6 +11,7 @@ import com.jayway.jsonpath.json.JsonParser; import java.io.IOException; +import java.util.List; import java.util.logging.Logger; import net.minidev.json.parser.ParseException; @@ -132,12 +133,8 @@ public class JsonPath { */ public JsonElement read(JsonElement json) throws JsonException { FilterOutput filterOutput = filters.filter(json); - - if (filterOutput == null || filterOutput.getResult() == null) { - return null; - } - return filterOutput.getResult(); + return filterOutput.getResultAsJson(); } diff --git a/json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java b/json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java index fb8e71fa..14ef9ca0 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java +++ b/json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java @@ -7,6 +7,7 @@ import com.jayway.jsonpath.json.JsonArray; import com.jayway.jsonpath.json.JsonElement; import com.jayway.jsonpath.json.JsonException; import com.jayway.jsonpath.json.JsonFactory; +import com.jayway.jsonpath.json.JsonPathResultList; import static java.lang.String.format; @@ -15,51 +16,39 @@ import static java.lang.String.format; * Date: 2/9/11 * Time: 12:28 PM */ -public class FilterOutput { +public class FilterOutput extends ArrayList { - private final List result; public FilterOutput(JsonElement root) { - this.result = new ArrayList(); - result.add(root); + super(); + this.add(root); + } + public FilterOutput(){ + super(); } - - public FilterOutput(List result) { - this.result = result; - } - - - public FilterOutput() { - this.result = new ArrayList(); + + public JsonArray getResultAsJsonArray() throws JsonException { + return this.get(0).toJsonArray(); } - - - public JsonElement getResult() throws JsonException { - if(result.size()==0){ - return null; + + public JsonElement getResultAsJson() throws JsonException { + if(this.size()>1){ + JsonArray ja = JsonFactory.getInstance().createJsonArray(); + for(JsonElement je:this){ + ja.add(je); + } + return ja; + } + else if(this.size()==1){ + return this.get(0); } - else if(result.size()==1){ - return result.get(0); - } else{ - JsonFactory fact = JsonFactory.getInstance(); - JsonArray ja = fact.createJsonArray(); - for(JsonElement ele:result) - ja.add(ele); - return ja; + return JsonFactory.getInstance().createJsonNull(null, null); } - } - - public JsonArray getResultAsList() throws JsonException { - return getResult().toJsonArray(); } + - - - public List getList() throws JsonException { - return result; - } diff --git a/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java b/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java index 6bd2a0cf..2e29b9a9 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java +++ b/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java @@ -14,13 +14,13 @@ import com.jayway.jsonpath.json.JsonException; */ public abstract class JsonPathFilterBase { public FilterOutput apply(FilterOutput element) throws JsonException{ - List result = new ArrayList(); - for(JsonElement el : element.getList()){ + FilterOutput result = new FilterOutput(); + for(JsonElement el : element){ List out = apply(el); if(out != null) result.addAll(out); } - return new FilterOutput(result); + return result; } public abstract List apply(JsonElement element) throws JsonException; public abstract String getPathSegment() throws JsonException;; diff --git a/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java b/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java index 875e3122..34803733 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java +++ b/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java @@ -43,17 +43,17 @@ public class JsonPathFilterChain { public FilterOutput filter(JsonElement root) throws JsonException { FilterOutput out = new FilterOutput(root); - log.info(out.getResult().toString()); + log.info(out.getResultAsJson().toString()); for (JsonPathFilterBase filter : filters) { if (filter == null) { throw new InvalidPathException(); } - if(out.getList() == null){ - return null; + if(out.getResultAsJson().isJsonNull()){ + break; } out = filter.apply(out); - if(out.getResult()!=null) - log.info(out.getResult().toString()); + + log.info(out.getResultAsJson().toString()); } diff --git a/json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java b/json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java index b7e46c69..69d276c1 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java +++ b/json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java @@ -3,10 +3,12 @@ package com.jayway.jsonpath.filter; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.regex.Pattern; +import com.google.gson.JsonNull; import com.jayway.jsonpath.json.JsonArray; import com.jayway.jsonpath.json.JsonElement; import com.jayway.jsonpath.json.JsonException; @@ -35,19 +37,31 @@ public class ListIndexFilter extends JsonPathFilterBase { @Override public List apply(JsonElement element) throws JsonException { - List result = new ArrayList(); - + Integer[] index = getArrayIndex(); - if(element.isJsonArray()){ - for (int i : index) { - if (indexIsInRange(element.toJsonArray(), i)) { - result.add(element.toJsonArray().get(i)); - } - } - } - + + ArrayList result = new ArrayList(); + filterRange(result,element,index); return result; + + + + } + + private void filterRange(T result,JsonElement element,Integer[] index) throws JsonException{ + if(element.isJsonArray()){ + for (int i : index) { + if (indexIsInRange(element.toJsonArray(), i)) { + result.add(element.toJsonArray().get(i)); + } + else{ + com.jayway.jsonpath.json.JsonNull jn = factory.createJsonNull(i,element); + result.add(jn); + } + + } + } } private boolean indexIsInRange(List list, int index) { 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 c45963cd..1dba0ebb 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java @@ -4,6 +4,7 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; +import com.google.gson.JsonNull; import com.jayway.jsonpath.json.JsonArray; import com.jayway.jsonpath.json.JsonElement; import com.jayway.jsonpath.json.JsonException; @@ -65,17 +66,19 @@ public abstract class JsonPathTest { " }\n" + "}"; + protected JsonFactory factory = null; @Before public void init_factory(){ + } @Test public void bracket_notation_can_be_used_in_path() throws Exception { - } - assertEquals("new", JsonPath.read(DOCUMENT, "$.['store'].bicycle.['dot.notation']")); - assertEquals("new", JsonPath.read(DOCUMENT, "$['store']['bicycle']['dot.notation']")); - assertEquals("new", JsonPath.read(DOCUMENT, "$.['store']['bicycle']['dot.notation']")); - assertEquals("new", JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['dot.notation']")); + + assertEquals(w("new"), JsonPath.read(DOCUMENT, "$.['store'].bicycle.['dot.notation']")); + assertEquals(w("new"), JsonPath.read(DOCUMENT, "$['store']['bicycle']['dot.notation']")); + assertEquals(w("new"), JsonPath.read(DOCUMENT, "$.['store']['bicycle']['dot.notation']")); + assertEquals(w("new"), JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['dot.notation']")); } @Test @@ -89,17 +92,25 @@ public abstract class JsonPathTest { @Test public void read_path_with_colon() throws Exception { - assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar"), "fooBar"); - assertEquals(JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['foo:bar']"), "fooBar"); - assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar").toObject(), "fooBar"); - assertEquals(JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['foo:bar']").toObject(), "fooBar"); - assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar"), "fooBar"); - assertEquals(JsonPath.read(DOCUMENT, "$['store']['bicycle']['foo:bar']"), "fooBar"); + assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar"), w("fooBar")); + assertEquals(JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['foo:bar']"), w("fooBar")); } - + private JsonElement w(Object obj) throws JsonException { + return factory.createJsonPrimitive(obj); + + } + private JsonElement[] w(Object ... objs) throws JsonException { + JsonElement je[]= new JsonElement[objs.length]; + for(int i=0;i)res, hasItems("Evelyn Waugh")); - assertEquals(res2.toObject(), "Evelyn Waugh"); - assertThat((List) res, hasItems("Evelyn Waugh")); //assertNull((); }