diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java index b04f1fa5..11744bd1 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java @@ -96,6 +96,10 @@ public class ArrayEvalFilter extends PathTokenFilter { } static Expression createExpression(String condition) { + condition = condition.trim(); + if (condition.startsWith("!")) { + return new NegationExpression(createExpression(condition.substring(1))); + } Matcher conditionMatcher = CONDITION_PATTERN.matcher(condition); if (conditionMatcher.matches()) { String property = conditionMatcher.group(1).trim(); @@ -270,4 +274,17 @@ public class ArrayEvalFilter extends PathTokenFilter { } } + + static class NegationExpression extends Expression { + private Expression expression; + + public NegationExpression(Expression expression) { + this.expression = expression; + } + + @Override + public boolean evaluate(Object check, Configuration configuration) { + return !expression.evaluate(check, configuration); + } + } } diff --git a/json-path/src/test/java/com/jayway/jsonpath/ComplianceTest.java b/json-path/src/test/java/com/jayway/jsonpath/ComplianceTest.java index 4dd22d48..1f63e310 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/ComplianceTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/ComplianceTest.java @@ -116,10 +116,9 @@ public class ComplianceTest { " }"; assertThat(JsonPath.>read(json, "$.menu.items[?(@ && @.id == 'ViewSVG')].id"), hasItems("ViewSVG")); - - //assertThat(JsonPath.>read(json, "$.menu.items[?(@ && @.id && !@.label)].id"), hasItems("?")); //low - assertThat(JsonPath.>read(json, "$.menu.items[?(@ && @.label && /SVG/.test(@.label))].id"), hasItems("CopySVG", "ViewSVG")); //low - //assertThat(JsonPath.>read(json, "$.menu.items[?(!@)]"), hasItems("?")); //low + assertThat(JsonPath.>read(json, "$.menu.items[?(@ && @.id && !@.label)].id"), hasItems("Open", "Quality", "Pause", "Mute", "Copy", "Help")); + assertThat(JsonPath.>read(json, "$.menu.items[?(@ && @.label && /SVG/.test(@.label))].id"), hasItems("CopySVG", "ViewSVG")); + assertThat(JsonPath.>read(json, "$.menu.items[?(!@)]"), hasItems((String)null, (String)null, (String)null, (String)null)); //assertThat(JsonPath.>read(json, "$..[0]"), hasItems("?")); //low }