Browse Source

Implement the field exists check. This is the '@' token on the

left hand side of '&&' in the expression below.
    
$.menu.items[?(@ && @.id == 'ViewSVG')].id
pull/37/head
Warwick Hunter 11 years ago
parent
commit
3cea075d1b
  1. 24
      json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java
  2. 1
      json-path/src/test/java/com/jayway/jsonpath/ComplianceTest.java

24
json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java

@ -30,7 +30,8 @@ import java.util.regex.Pattern;
public class ArrayEvalFilter extends PathTokenFilter {
private static final Pattern CONDITION_STATEMENT_PATTERN = Pattern.compile("\\[\\s?\\?\\(.*?[!=<>]+.*?\\)\\s?]");
private static final Pattern PATTERN = Pattern.compile("\\s?(@.*?)\\s?([!=<>]+)\\s?(.*?)\\s?");
private static final Pattern CONDITION_PATTERN = Pattern.compile("\\s?(@.*?)\\s?([!=<>]+)\\s?(.*?)\\s?");
private static final Pattern FIELD_EXISTS_PATTERN = Pattern.compile("\\s?(@.*?)\\s?(.*?)\\s?");
@ -86,7 +87,7 @@ public class ArrayEvalFilter extends PathTokenFilter {
private boolean isMatch(Object check, Configuration configuration, ConditionStatement... conditionStatements) {
try {
for (ConditionStatement conditionStatement : conditionStatements) {
Object value = conditionStatement.path.read(check, configuration.options(Option.THROW_ON_MISSING_PROPERTY));
Object value = (check != null) ? conditionStatement.path.read(check, configuration.options(Option.THROW_ON_MISSING_PROPERTY)) : null;
boolean match = ExpressionEvaluator.eval(value, conditionStatement.getOperator(), conditionStatement.getExpected());
if(!match){
return false;
@ -105,16 +106,19 @@ public class ArrayEvalFilter extends PathTokenFilter {
}
static ConditionStatement createConditionStatement(String condition) {
Matcher matcher = PATTERN.matcher(condition);
if (matcher.matches()) {
String property = matcher.group(1).trim();
String operator = matcher.group(2).trim();
String expected = matcher.group(3).trim();
Matcher conditionMatcher = CONDITION_PATTERN.matcher(condition);
if (conditionMatcher.matches()) {
String property = conditionMatcher.group(1).trim();
String operator = conditionMatcher.group(2).trim();
String expected = conditionMatcher.group(3).trim();
return new ConditionStatement(condition, property, operator, expected);
} else {
return null;
}
Matcher fieldExistsMatcher = FIELD_EXISTS_PATTERN.matcher(condition);
if (fieldExistsMatcher.matches()) {
// Field exists check, the single '@' in: $.menu.items[?(@ && @.id == 'ViewSVG')].id
return new ConditionStatement(condition, "@.", "!=", "null");
}
return null;
}
static class ConditionStatement {

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

@ -115,6 +115,7 @@ public class ComplianceTest {
" }\n" +
" }";
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("?")); //low

Loading…
Cancel
Save