diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterFactory.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterFactory.java index bfd90374..f370606b 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterFactory.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterFactory.java @@ -64,7 +64,7 @@ public class FilterFactory { return new ArrayEvalFilter(pathFragment); } else if (!pathFragment.contains("=") && !pathFragment.contains("<") && !pathFragment.contains(">")) { //[?(@.isbn)] - return new HasFieldFilter(pathFragment); + return new HasPathFilter(pathFragment); } else { throw new InvalidPathException("Failed to create PathTokenFilter for path fragment: " + pathFragment); } diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/HasFieldFilter.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/HasPathFilter.java similarity index 75% rename from json-path/src/main/java/com/jayway/jsonpath/internal/filter/HasFieldFilter.java rename to json-path/src/main/java/com/jayway/jsonpath/internal/filter/HasPathFilter.java index 347e586c..271b4ffa 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/HasFieldFilter.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/HasPathFilter.java @@ -15,18 +15,19 @@ package com.jayway.jsonpath.internal.filter; import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.Option; +import com.jayway.jsonpath.PathNotFoundException; import com.jayway.jsonpath.spi.JsonProvider; -import java.util.Collection; - /** * @author Kalle Stenflo */ -public class HasFieldFilter extends PathTokenFilter { +public class HasPathFilter extends PathTokenFilter { - private final String trimmedCondition; + private final JsonPath path; - public HasFieldFilter(String condition) { + public HasPathFilter(String condition) { super(condition); String trimmedCondition = condition; @@ -35,7 +36,7 @@ public class HasFieldFilter extends PathTokenFilter { trimmedCondition = trimmedCondition.replace("']", ""); } - this.trimmedCondition = trim(trimmedCondition, 5, 2); + this.path = JsonPath.compile(trim(trimmedCondition, 5, 2)); } @Override @@ -48,9 +49,11 @@ public class HasFieldFilter extends PathTokenFilter { for (Object item : src) { if(jsonProvider.isMap(item)){ - Collection keys = jsonProvider.getPropertyKeys(item); - if(keys.contains(trimmedCondition)){ + try{ + path.read(item, Configuration.builder().options(Option.THROW_ON_MISSING_PROPERTY).jsonProvider(jsonProvider).build()); jsonProvider.setProperty(result, jsonProvider.length(result), item); + } catch (PathNotFoundException e){ + // the path was not found in the item } } } 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 ee2ae0f9..b17ec5c6 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java @@ -8,6 +8,7 @@ import java.util.Map; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.*; /** @@ -316,6 +317,12 @@ public class JsonPathTest { } + @Test + public void exists_filter_with_nested_path() throws Exception { + + assertThat(JsonPath.>read(DOCUMENT, "$..[?(@.bicycle.color)]"), hasSize(1)); + assertThat(JsonPath.>read(DOCUMENT, "$..[?(@.bicycle.numberOfGears)]"), hasSize(0)); + } }