Browse Source

Improved type safety and performance in JsonProvider.

pull/41/head
Kalle Stenflo 10 years ago
parent
commit
1f79c6d357
  1. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/EvaluationContextImpl.java
  2. 10
      json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/PathToken.java
  3. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/ScanPathToken.java
  4. 42
      json-path/src/main/java/com/jayway/jsonpath/internal/spi/json/AbstractJsonProvider.java
  5. 29
      json-path/src/main/java/com/jayway/jsonpath/spi/json/JsonProvider.java

2
json-path/src/main/java/com/jayway/jsonpath/internal/spi/compiler/EvaluationContextImpl.java

@ -52,7 +52,7 @@ class EvaluationContextImpl implements EvaluationContext {
@Override @Override
public <T> T get() { public <T> T get() {
if (path.isDefinite()) { if (path.isDefinite()) {
return (T) jsonProvider().getProperty(objectResult, 0); return (T) jsonProvider().getArrayIndex(objectResult, 0);
} }
return (T) objectResult; return (T) objectResult;
} }

10
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; import java.util.List;
/**
*
*/
abstract class PathToken { abstract class PathToken {
private PathToken next; private PathToken next;
@ -70,16 +67,13 @@ abstract class PathToken {
} }
private Object readObjectProperty(String property, Object model, EvaluationContextImpl ctx) { private Object readObjectProperty(String property, Object model, EvaluationContextImpl ctx) {
if (ctx.options().contains(Option.THROW_ON_MISSING_PROPERTY) && !ctx.jsonProvider().getPropertyKeys(model).contains(property)) { return ctx.jsonProvider().getMapValue(model, property, ctx.options().contains(Option.THROW_ON_MISSING_PROPERTY));
throw new PathNotFoundException("Path [" + property + "] not found in the current context" );
}
return ctx.jsonProvider().getProperty(model, property);
} }
void handleArrayIndex(int index, String currentPath, Object json, EvaluationContextImpl ctx) { void handleArrayIndex(int index, String currentPath, Object json, EvaluationContextImpl ctx) {
String evalPath = currentPath + "[" + index + "]"; String evalPath = currentPath + "[" + index + "]";
try { try {
Object evalHit = ctx.jsonProvider().getProperty(json, index); Object evalHit = ctx.jsonProvider().getArrayIndex(json, index);
if (isLeaf()) { if (isLeaf()) {
ctx.addResult(evalPath, evalHit); ctx.addResult(evalPath, evalHit);
} else { } else {

2
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) { for (String property : properties) {
String evalPath = currentPath + "['" + property + "']"; String evalPath = currentPath + "['" + property + "']";
Object propertyModel = ctx.jsonProvider().getProperty(model, property); Object propertyModel = ctx.jsonProvider().getMapValue(model, property);
walk(evalPath, propertyModel, ctx, predicate, predicateMatches); walk(evalPath, propertyModel, ctx, predicate, predicateMatches);
} }

42
json-path/src/main/java/com/jayway/jsonpath/internal/spi/json/AbstractJsonProvider.java

@ -14,6 +14,7 @@
*/ */
package com.jayway.jsonpath.internal.spi.json; package com.jayway.jsonpath.internal.spi.json;
import com.jayway.jsonpath.PathNotFoundException;
import com.jayway.jsonpath.internal.Utils; import com.jayway.jsonpath.internal.Utils;
import com.jayway.jsonpath.spi.json.JsonProvider; import com.jayway.jsonpath.spi.json.JsonProvider;
@ -50,6 +51,47 @@ public abstract class AbstractJsonProvider implements JsonProvider {
return (obj instanceof List); 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 * Extracts a value from an object or array
* *

29
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.InputStream;
import java.io.Reader; import java.io.Reader;
import java.util.Collection; import java.util.Collection;
import java.util.List;
public interface JsonProvider { public interface JsonProvider {
@ -90,6 +91,34 @@ public interface JsonProvider {
*/ */
Object getProperty(Object obj, Object key); 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 * Sets a value in an object or array
* *

Loading…
Cancel
Save