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
public <T> T get() {
if (path.isDefinite()) {
return (T) jsonProvider().getProperty(objectResult, 0);
return (T) jsonProvider().getArrayIndex(objectResult, 0);
}
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;
/**
*
*/
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 {

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) {
String evalPath = currentPath + "['" + property + "']";
Object propertyModel = ctx.jsonProvider().getProperty(model, property);
Object propertyModel = ctx.jsonProvider().getMapValue(model, property);
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;
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
*

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.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
*

Loading…
Cancel
Save