diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/EvaluationContextImpl.java b/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/EvaluationContextImpl.java index 1e6c1c24..6e66050f 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/EvaluationContextImpl.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/EvaluationContextImpl.java @@ -52,7 +52,7 @@ class EvaluationContextImpl implements EvaluationContext { @Override public T get() { if (path.isDefinite()) { - return (T) jsonProvider().getProperty(objectResult, 0); + return (T) jsonProvider().getArrayIndex(objectResult, 0); } return (T) objectResult; } diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/PathToken.java b/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/PathToken.java index 8c7496f5..636bb309 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/PathToken.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/PathToken.java @@ -7,9 +7,6 @@ import com.jayway.jsonpath.internal.Utils; import java.util.List; -/** - * - */ abstract class PathToken { private PathToken next; @@ -70,16 +67,13 @@ abstract class PathToken { } private Object readObjectProperty(String property, Object model, EvaluationContextImpl ctx) { - if (ctx.options().contains(Option.THROW_ON_MISSING_PROPERTY) && !ctx.jsonProvider().getPropertyKeys(model).contains(property)) { - throw new PathNotFoundException("Path [" + property + "] not found in the current context" ); - } - return ctx.jsonProvider().getProperty(model, property); + return ctx.jsonProvider().getMapValue(model, property, ctx.options().contains(Option.THROW_ON_MISSING_PROPERTY)); } void handleArrayIndex(int index, String currentPath, Object json, EvaluationContextImpl ctx) { String evalPath = currentPath + "[" + index + "]"; try { - Object evalHit = ctx.jsonProvider().getProperty(json, index); + Object evalHit = ctx.jsonProvider().getArrayIndex(json, index); if (isLeaf()) { ctx.addResult(evalPath, evalHit); } else { diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/ScanPathToken.java b/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/ScanPathToken.java index eb481ff0..3aef735e 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/ScanPathToken.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/ScanPathToken.java @@ -78,7 +78,7 @@ class ScanPathToken extends PathToken { for (String property : properties) { String evalPath = currentPath + "['" + property + "']"; - Object propertyModel = ctx.jsonProvider().getProperty(model, property); + Object propertyModel = ctx.jsonProvider().getMapValue(model, property); walk(evalPath, propertyModel, ctx, predicate, predicateMatches); } diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/spi/json/AbstractJsonProvider.java b/json-path/src/main/java/com/jayway/jsonpath/internal/spi/json/AbstractJsonProvider.java index 22c17d76..5f0f2ee7 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/spi/json/AbstractJsonProvider.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/spi/json/AbstractJsonProvider.java @@ -14,6 +14,7 @@ */ package com.jayway.jsonpath.internal.spi.json; +import com.jayway.jsonpath.PathNotFoundException; import com.jayway.jsonpath.internal.Utils; import com.jayway.jsonpath.spi.json.JsonProvider; @@ -50,6 +51,47 @@ public abstract class AbstractJsonProvider implements JsonProvider { return (obj instanceof List); } + + /** + * Extracts a value from an array + * + * @param obj an array + * @param idx index + * @return the entry at the given index + */ + public Object getArrayIndex(Object obj, int idx) { + return ((List) obj).get(idx); + } + + /** + * Extracts a value from an map + * + * @param obj a map + * @param key property key + * @return the map entry + */ + public Object getMapValue(Object obj, String key){ + return ((Map) obj).get(key); + } + + /** + * Extracts a value from an map + * + * @param obj a map + * @param key property key + * @param throwOnMissing if true a PathNotFoundException is thrown if property is missing + * @return the map entry + */ + public Object getMapValue(Object obj, String key, boolean throwOnMissing){ + Map m = (Map) obj; + if(!m.containsKey(key)){ + throw new PathNotFoundException("Property ['" + key + "'] not found in the current context" ); + } else { + return m.get(key); + } + } + + /** * Extracts a value from an object or array * diff --git a/json-path/src/main/java/com/jayway/jsonpath/spi/json/JsonProvider.java b/json-path/src/main/java/com/jayway/jsonpath/spi/json/JsonProvider.java index 51f08186..70257775 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/spi/json/JsonProvider.java +++ b/json-path/src/main/java/com/jayway/jsonpath/spi/json/JsonProvider.java @@ -19,6 +19,7 @@ import com.jayway.jsonpath.InvalidJsonException; import java.io.InputStream; import java.io.Reader; import java.util.Collection; +import java.util.List; public interface JsonProvider { @@ -90,6 +91,34 @@ public interface JsonProvider { */ Object getProperty(Object obj, Object key); + /** + * Extracts a value from an array + * + * @param obj an array + * @param idx index + * @return the entry at the given index + */ + Object getArrayIndex(Object obj, int idx); + + /** + * Extracts a value from an map + * + * @param obj a map + * @param key property key + * @return the map entry + */ + Object getMapValue(Object obj, String key); + + /** + * Extracts a value from an map + * + * @param obj a map + * @param key property key + * @param throwOnMissing if true a PathNotFoundException is thrown if property is not defined + * @return the map entry + */ + Object getMapValue(Object obj, String key, boolean throwOnMissing); + /** * Sets a value in an object or array *