Browse Source

ArrayEvalFilter: add support for ! (logical negation) operator

pull/39/head
Laurent Charrière 11 years ago
parent
commit
b62cef7a34
  1. 17
      json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java
  2. 7
      json-path/src/test/java/com/jayway/jsonpath/ComplianceTest.java

17
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);
}
}
}

7
json-path/src/test/java/com/jayway/jsonpath/ComplianceTest.java

@ -116,10 +116,9 @@ public class ComplianceTest {
" }";
assertThat(JsonPath.<List<String>>read(json, "$.menu.items[?(@ && @.id == 'ViewSVG')].id"), hasItems("ViewSVG"));
//assertThat(JsonPath.<List<String>>read(json, "$.menu.items[?(@ && @.id && !@.label)].id"), hasItems("?")); //low
assertThat(JsonPath.<List<String>>read(json, "$.menu.items[?(@ && @.label && /SVG/.test(@.label))].id"), hasItems("CopySVG", "ViewSVG")); //low
//assertThat(JsonPath.<List<String>>read(json, "$.menu.items[?(!@)]"), hasItems("?")); //low
assertThat(JsonPath.<List<String>>read(json, "$.menu.items[?(@ && @.id && !@.label)].id"), hasItems("Open", "Quality", "Pause", "Mute", "Copy", "Help"));
assertThat(JsonPath.<List<String>>read(json, "$.menu.items[?(@ && @.label && /SVG/.test(@.label))].id"), hasItems("CopySVG", "ViewSVG"));
assertThat(JsonPath.<List<String>>read(json, "$.menu.items[?(!@)]"), hasItems((String)null, (String)null, (String)null, (String)null));
//assertThat(JsonPath.<List<String>>read(json, "$..[0]"), hasItems("?")); //low
}

Loading…
Cancel
Save