Browse Source

Support for getting the length of an array.

pull/100/head
Nicholas Rahn 10 years ago
parent
commit
5026ea0e78
  1. 11
      json-path/src/main/java/com/jayway/jsonpath/internal/token/PathToken.java
  2. 5
      json-path/src/main/java/com/jayway/jsonpath/internal/token/PropertyPathToken.java
  3. 7
      json-path/src/test/java/com/jayway/jsonpath/JsonProviderTest.java

11
json-path/src/main/java/com/jayway/jsonpath/internal/token/PathToken.java

@ -128,6 +128,17 @@ public abstract class PathToken {
}
}
void handleArrayLength(String currentPath, Object model, EvaluationContextImpl ctx) {
String evalPath = currentPath + ".length";
PathRef pathRef = ctx.forUpdate() ? PathRef.create(model, "length") : PathRef.NO_OP;
Object evalHit = ctx.jsonProvider().length(model);
if (isLeaf()) {
ctx.addResult(evalPath, pathRef, evalHit);
} else {
next().evaluate(evalPath, pathRef, evalHit, ctx);
}
}
PathToken prev(){
return prev;
}

5
json-path/src/main/java/com/jayway/jsonpath/internal/token/PropertyPathToken.java

@ -38,6 +38,11 @@ public class PropertyPathToken extends PathToken {
@Override
public void evaluate(String currentPath, PathRef parent, Object model, EvaluationContextImpl ctx) {
if (!ctx.jsonProvider().isMap(model)) {
// Special case handling of the 'length' property of arrays.
if (isLeaf() && ctx.jsonProvider().isArray(model) && properties.size() == 1 && properties.get(0).equals("length")) {
handleArrayLength(currentPath, model, ctx);
return;
}
throw new PathNotFoundException("Property " + getPathFragment() + " not found in path " + currentPath);
}

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

@ -75,6 +75,13 @@ public class JsonProviderTest extends BaseTest {
assertThat(using(GSON_CONFIGURATION).parse(JSON).read("$", typeRef)).extracting("foo").containsExactly("foo0", "foo1", "foo2");
}
@Test
public void length_of_array() {
assertThat(using(JACKSON_CONFIGURATION).parse(JSON_DOCUMENT).read("$.store.book.length", Integer.class)).isEqualTo(4);
assertThat(using(JACKSON_JSON_NODE_CONFIGURATION).parse(JSON_DOCUMENT).read("$.store.book.length", Integer.class)).isEqualTo(4);
assertThat(using(JSON_SMART_CONFIGURATION).parse(JSON_DOCUMENT).read("$.store.book.length", Integer.class)).isEqualTo(4);
assertThat(using(GSON_CONFIGURATION).parse(JSON_DOCUMENT).read("$.store.book.length", Integer.class)).isEqualTo(4);
}
public static class FooBarBaz<T> {
public T gen;

Loading…
Cancel
Save