kalle
14 years ago
16 changed files with 947 additions and 227 deletions
@ -1,40 +0,0 @@ |
|||||||
package com.jayway.jsonassert.impl; |
|
||||||
|
|
||||||
import java.util.LinkedList; |
|
||||||
import java.util.Queue; |
|
||||||
|
|
||||||
/** |
|
||||||
* User: kalle stenflo |
|
||||||
* Date: 1/23/11 |
|
||||||
* Time: 1:52 PM |
|
||||||
*/ |
|
||||||
class JSONPath { |
|
||||||
|
|
||||||
private final Queue<JSONPathFragment> path; |
|
||||||
|
|
||||||
JSONPath(String path) { |
|
||||||
this.path = compilePathFragments(path); |
|
||||||
} |
|
||||||
|
|
||||||
boolean hasMoreFragments(){ |
|
||||||
return !path.isEmpty(); |
|
||||||
} |
|
||||||
|
|
||||||
JSONPathFragment nextFragment(){ |
|
||||||
return path.poll(); |
|
||||||
} |
|
||||||
|
|
||||||
private Queue<JSONPathFragment> compilePathFragments(String path) { |
|
||||||
//TODO: this needs some attention but will work for now
|
|
||||||
Queue<JSONPathFragment> processed = new LinkedList<JSONPathFragment>(); |
|
||||||
for (String fragment : path.split("[\\.|\\[]")) { |
|
||||||
if (fragment.trim().length() > 0) { |
|
||||||
|
|
||||||
String compiledFragment = fragment.endsWith("]") ? "[" + fragment : fragment; |
|
||||||
|
|
||||||
processed.add(new JSONPathFragment(compiledFragment)); |
|
||||||
} |
|
||||||
} |
|
||||||
return processed; |
|
||||||
} |
|
||||||
} |
|
@ -1,69 +0,0 @@ |
|||||||
package com.jayway.jsonassert.impl; |
|
||||||
|
|
||||||
import java.util.regex.Matcher; |
|
||||||
import java.util.regex.Pattern; |
|
||||||
|
|
||||||
/** |
|
||||||
* User: kalle stenflo |
|
||||||
* Date: 1/23/11 |
|
||||||
* Time: 1:55 PM |
|
||||||
*/ |
|
||||||
class JSONPathFragment { |
|
||||||
|
|
||||||
private static final Pattern ARRAY_POSITION_PATTER = Pattern.compile("\\[(\\d*)\\]"); |
|
||||||
private static final Pattern GROOVY_POSITION_PATTER = Pattern.compile("get\\((\\d*)\\)"); |
|
||||||
|
|
||||||
private static final Pattern ARRAY_WILDCARD_PATTER = Pattern.compile("\\[\\*\\]"); |
|
||||||
private static final Pattern GROOVY_WILDCARD_PATTER = Pattern.compile("get\\(\\*\\)"); |
|
||||||
|
|
||||||
private final String fragment; |
|
||||||
|
|
||||||
JSONPathFragment(String fragment) { |
|
||||||
this.fragment = fragment; |
|
||||||
} |
|
||||||
|
|
||||||
String value() { |
|
||||||
return fragment; |
|
||||||
} |
|
||||||
|
|
||||||
String appendToPath(String path){ |
|
||||||
StringBuilder builder = new StringBuilder(path); |
|
||||||
|
|
||||||
if(ARRAY_POSITION_PATTER.matcher(fragment).matches()){ |
|
||||||
builder.append("[").append(getArrayIndex()).append("]"); |
|
||||||
} |
|
||||||
else if(GROOVY_POSITION_PATTER.matcher(fragment).matches()){ |
|
||||||
builder.append(path.isEmpty()?"":".").append("get(").append(getArrayIndex()).append(")"); |
|
||||||
} |
|
||||||
else if(ARRAY_WILDCARD_PATTER.matcher(fragment).matches()){ |
|
||||||
builder.append("[*]"); |
|
||||||
} |
|
||||||
else if(GROOVY_WILDCARD_PATTER.matcher(fragment).matches()){ |
|
||||||
builder.append(path.isEmpty()?"":".").append("get(*)"); |
|
||||||
} |
|
||||||
else { |
|
||||||
builder.append(path.isEmpty()?"":".").append(fragment); |
|
||||||
} |
|
||||||
return builder.toString(); |
|
||||||
} |
|
||||||
|
|
||||||
boolean isArrayIndex() { |
|
||||||
return ARRAY_POSITION_PATTER.matcher(fragment).matches() || GROOVY_POSITION_PATTER.matcher(fragment).matches(); |
|
||||||
} |
|
||||||
|
|
||||||
boolean isArrayWildcard() { |
|
||||||
return ARRAY_WILDCARD_PATTER.matcher(fragment).matches() || GROOVY_WILDCARD_PATTER.matcher(fragment).matches(); |
|
||||||
} |
|
||||||
|
|
||||||
int getArrayIndex() { |
|
||||||
Matcher matcher = ARRAY_POSITION_PATTER.matcher(fragment); |
|
||||||
if (matcher.matches()) { |
|
||||||
return Integer.parseInt(matcher.group(1)); |
|
||||||
} |
|
||||||
matcher = GROOVY_POSITION_PATTER.matcher(fragment); |
|
||||||
if (matcher.matches()) { |
|
||||||
return Integer.parseInt(matcher.group(1)); |
|
||||||
} |
|
||||||
throw new IllegalArgumentException("not an array index fragment"); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,185 @@ |
|||||||
|
package com.jayway.jsonassert.impl; |
||||||
|
|
||||||
|
import com.jayway.jsonassert.InvalidPathException; |
||||||
|
import com.jayway.jsonassert.JsonPath; |
||||||
|
import org.json.simple.JSONArray; |
||||||
|
import org.json.simple.JSONObject; |
||||||
|
import org.json.simple.parser.JSONParser; |
||||||
|
import org.json.simple.parser.ParseException; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.Reader; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* User: kalle stenflo |
||||||
|
* Date: 2/1/11 |
||||||
|
* Time: 8:45 AM |
||||||
|
* |
||||||
|
* http://goessner.net/articles/JsonPath/
|
||||||
|
*/ |
||||||
|
public class JsonPathImpl implements JsonPath { |
||||||
|
|
||||||
|
private static final JSONParser JSON_PARSER = new JSONParser(); |
||||||
|
|
||||||
|
private Object model; |
||||||
|
|
||||||
|
public static synchronized JsonPath parse(Reader reader) throws java.text.ParseException, IOException { |
||||||
|
try { |
||||||
|
return new JsonPathImpl(JSON_PARSER.parse(reader)); |
||||||
|
} catch (IOException e) { |
||||||
|
throw e; |
||||||
|
} catch (ParseException e) { |
||||||
|
throw new java.text.ParseException(e.getMessage(), e.getPosition()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized JsonPath parse(String jsonDoc) throws java.text.ParseException { |
||||||
|
try { |
||||||
|
return new JsonPathImpl(JSON_PARSER.parse(jsonDoc)); |
||||||
|
} catch (ParseException e) { |
||||||
|
throw new java.text.ParseException(e.getMessage(), e.getPosition()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public JsonPathImpl(Object model) { |
||||||
|
this.model = model; |
||||||
|
} |
||||||
|
|
||||||
|
private void read(Object root, Path path, ReaderContext ctx, boolean strict) { |
||||||
|
if (!path.hasMoreFragments()) { |
||||||
|
ctx.addResult(root); |
||||||
|
return; |
||||||
|
} |
||||||
|
if (isDocument(root)) { |
||||||
|
PathFragment fragment = path.poll(); |
||||||
|
|
||||||
|
if(strict && !toDocument(root).containsKey(fragment.value())){ |
||||||
|
throw new InvalidPathException(); |
||||||
|
} |
||||||
|
|
||||||
|
Object extracted = toDocument(root).get(fragment.value()); |
||||||
|
|
||||||
|
if (fragment.isLeaf()) { |
||||||
|
ctx.addResult(extracted); |
||||||
|
} else { |
||||||
|
read(extracted, path.clone(), ctx, strict); |
||||||
|
} |
||||||
|
} else { |
||||||
|
PathFragment fragment = path.poll(); |
||||||
|
|
||||||
|
if (fragment.isArrayIndex()) { |
||||||
|
Object extracted = toArray(root).get(fragment.getArrayIndex()); |
||||||
|
|
||||||
|
read(extracted, path.clone(), ctx, strict); |
||||||
|
|
||||||
|
} else if (fragment.isArrayWildcard()) { |
||||||
|
ctx.split(); |
||||||
|
|
||||||
|
for (Object extracted : toArray(root)) { |
||||||
|
read(extracted, path.clone(), ctx, strict); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static class ReaderContext { |
||||||
|
private JSONArray result = new JSONArray(); |
||||||
|
private boolean pathSplit = false; |
||||||
|
|
||||||
|
private void addResult(Object obj) { |
||||||
|
result.add(obj); |
||||||
|
} |
||||||
|
|
||||||
|
private void split() { |
||||||
|
pathSplit = true; |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isPathSplit() { |
||||||
|
return pathSplit; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private <T> T get(String jsonPath, boolean strict) { |
||||||
|
Path path = new Path(jsonPath); |
||||||
|
|
||||||
|
ReaderContext ctx = new ReaderContext(); |
||||||
|
|
||||||
|
read(model, path.clone(), ctx, strict); |
||||||
|
|
||||||
|
if (ctx.isPathSplit()) { |
||||||
|
return (T) ctx.result; |
||||||
|
} else { |
||||||
|
return (T) ctx.result.get(0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public JsonPath getReader(String path) { |
||||||
|
|
||||||
|
Object subModel = get(path); |
||||||
|
|
||||||
|
if (!isArray(subModel) && !isDocument(subModel)) { |
||||||
|
throw new InvalidPathException(); |
||||||
|
} |
||||||
|
return new JsonPathImpl(subModel); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean hasJsonPath(String path) { |
||||||
|
boolean hasPath = true; |
||||||
|
try { |
||||||
|
get(path, true); |
||||||
|
} catch (Exception e) { |
||||||
|
hasPath = false; |
||||||
|
} |
||||||
|
return hasPath; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isNull(String path) { |
||||||
|
return (get(path) == null); |
||||||
|
} |
||||||
|
|
||||||
|
public <T> T get(String jsonPath) { |
||||||
|
return (T) get(jsonPath, false); |
||||||
|
} |
||||||
|
|
||||||
|
public String getString(String path) { |
||||||
|
return get(path); |
||||||
|
} |
||||||
|
|
||||||
|
public Long getLong(String path) { |
||||||
|
return get(path); |
||||||
|
} |
||||||
|
|
||||||
|
public Double getDouble(String path) { |
||||||
|
return get(path); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getBoolean(String path) { |
||||||
|
return get(path); |
||||||
|
} |
||||||
|
|
||||||
|
public <T> List<T> getList(String path) { |
||||||
|
return get(path); |
||||||
|
} |
||||||
|
|
||||||
|
public Map<String, Object> getMap(String path) { |
||||||
|
return get(path); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isArray(Object obj) { |
||||||
|
return (obj instanceof JSONArray); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isDocument(Object obj) { |
||||||
|
return (obj instanceof JSONObject); |
||||||
|
} |
||||||
|
|
||||||
|
private JSONArray toArray(Object array) { |
||||||
|
return (JSONArray) array; |
||||||
|
} |
||||||
|
|
||||||
|
private JSONObject toDocument(Object document) { |
||||||
|
return (JSONObject) document; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,72 @@ |
|||||||
|
package com.jayway.jsonassert.impl; |
||||||
|
|
||||||
|
import java.util.LinkedList; |
||||||
|
import java.util.Queue; |
||||||
|
|
||||||
|
/** |
||||||
|
* User: kalle stenflo |
||||||
|
* Date: 1/23/11 |
||||||
|
* Time: 1:52 PM |
||||||
|
*/ |
||||||
|
class Path { |
||||||
|
|
||||||
|
private final Queue<PathFragment> path; |
||||||
|
|
||||||
|
Path(String path) { |
||||||
|
this.path = compilePathFragments(path); |
||||||
|
} |
||||||
|
|
||||||
|
Path(Queue<PathFragment> path) { |
||||||
|
this.path = new LinkedList<PathFragment>(); |
||||||
|
this.path.addAll(path); |
||||||
|
} |
||||||
|
|
||||||
|
int size() { |
||||||
|
return path.size(); |
||||||
|
} |
||||||
|
|
||||||
|
boolean hasMoreFragments() { |
||||||
|
return !path.isEmpty(); |
||||||
|
} |
||||||
|
|
||||||
|
PathFragment poll() { |
||||||
|
return path.poll(); |
||||||
|
} |
||||||
|
|
||||||
|
PathFragment peek() { |
||||||
|
return path.peek(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Path clone() { |
||||||
|
return new Path(path); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
String result = ""; |
||||||
|
for (PathFragment fragment : path) { |
||||||
|
result = fragment.appendToPath(result); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
private Queue<PathFragment> compilePathFragments(String path) { |
||||||
|
//TODO: this needs some attention but will work for now
|
||||||
|
Queue<PathFragment> processed = new LinkedList<PathFragment>(); |
||||||
|
|
||||||
|
String[] split = path.split("[\\.|\\[]"); |
||||||
|
|
||||||
|
for (int i = 0; i < split.length; i++) { |
||||||
|
if (split[i].trim().length() > 0) { |
||||||
|
|
||||||
|
String compiledFragment = split[i].endsWith("]") ? "[" + split[i] : split[i]; |
||||||
|
|
||||||
|
boolean isLeaf = (i == split.length - 1); |
||||||
|
|
||||||
|
processed.add(new PathFragment(compiledFragment, isLeaf)); |
||||||
|
} |
||||||
|
} |
||||||
|
return processed; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,122 @@ |
|||||||
|
package com.jayway.jsonassert.impl; |
||||||
|
|
||||||
|
import java.util.regex.Matcher; |
||||||
|
import java.util.regex.Pattern; |
||||||
|
|
||||||
|
/** |
||||||
|
* User: kalle stenflo |
||||||
|
* Date: 1/23/11 |
||||||
|
* Time: 1:55 PM |
||||||
|
*/ |
||||||
|
class PathFragment { |
||||||
|
|
||||||
|
//matches array index accessers like : [1], [23]
|
||||||
|
private static final Pattern ARRAY_POSITION_PATTER = Pattern.compile("\\[(\\d*)\\]"); |
||||||
|
|
||||||
|
//matches groovy style array index accessers like : get(1), get(23)
|
||||||
|
private static final Pattern GROOVY_POSITION_PATTER = Pattern.compile("get\\((\\d*)\\)"); |
||||||
|
|
||||||
|
//matches array wildcard : [*]
|
||||||
|
private static final Pattern ARRAY_WILDCARD_PATTER = Pattern.compile("\\[\\*\\]"); |
||||||
|
|
||||||
|
//matches groovy style array wildcard : [*]
|
||||||
|
private static final Pattern GROOVY_WILDCARD_PATTER = Pattern.compile("get\\(\\*\\)"); |
||||||
|
|
||||||
|
private final String value; |
||||||
|
|
||||||
|
private final boolean leaf; |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a new path fragment |
||||||
|
* |
||||||
|
* @param value value of path fragment |
||||||
|
* @param leaf |
||||||
|
*/ |
||||||
|
PathFragment(String value, boolean leaf) { |
||||||
|
this.value = value; |
||||||
|
this.leaf = leaf; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return "JSONPathFragment{" + |
||||||
|
"value='" + value + '\'' + |
||||||
|
'}'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @return the value of this path fragment |
||||||
|
*/ |
||||||
|
String value() { |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Utility method to rebuild a path from path fragments |
||||||
|
* |
||||||
|
* @param path the path to append this path fragment to |
||||||
|
* |
||||||
|
* @return the new extended path |
||||||
|
*/ |
||||||
|
String appendToPath(String path){ |
||||||
|
StringBuilder builder = new StringBuilder(path); |
||||||
|
|
||||||
|
if(ARRAY_POSITION_PATTER.matcher(value).matches()){ |
||||||
|
builder.append("[").append(getArrayIndex()).append("]"); |
||||||
|
} |
||||||
|
else if(GROOVY_POSITION_PATTER.matcher(value).matches()){ |
||||||
|
builder.append(path.isEmpty()?"":".").append("get(").append(getArrayIndex()).append(")"); |
||||||
|
} |
||||||
|
else if(ARRAY_WILDCARD_PATTER.matcher(value).matches()){ |
||||||
|
builder.append("[*]"); |
||||||
|
} |
||||||
|
else if(GROOVY_WILDCARD_PATTER.matcher(value).matches()){ |
||||||
|
builder.append(path.isEmpty()?"":".").append("get(*)"); |
||||||
|
} |
||||||
|
else { |
||||||
|
builder.append(path.isEmpty()?"":".").append(value); |
||||||
|
} |
||||||
|
return builder.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
boolean isLeaf(){ |
||||||
|
return leaf; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check if this path fragment is a array index |
||||||
|
* |
||||||
|
* @return true if this fragment is an array index |
||||||
|
*/ |
||||||
|
boolean isArrayIndex() { |
||||||
|
return ARRAY_POSITION_PATTER.matcher(value).matches() || GROOVY_POSITION_PATTER.matcher(value).matches(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check if this path fragment is an array wildcard |
||||||
|
* |
||||||
|
* @return true if this fragment is an array wildcard |
||||||
|
*/ |
||||||
|
boolean isArrayWildcard() { |
||||||
|
return ARRAY_WILDCARD_PATTER.matcher(value).matches() || GROOVY_WILDCARD_PATTER.matcher(value).matches(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* returns the int index of this path fragment. If this is not an array index fragment |
||||||
|
* an UnsupportedOperationException is thrown |
||||||
|
* |
||||||
|
* @return the array index of this fragment |
||||||
|
*/ |
||||||
|
int getArrayIndex() { |
||||||
|
Matcher matcher = ARRAY_POSITION_PATTER.matcher(value); |
||||||
|
if (matcher.matches()) { |
||||||
|
return Integer.parseInt(matcher.group(1)); |
||||||
|
} |
||||||
|
matcher = GROOVY_POSITION_PATTER.matcher(value); |
||||||
|
if (matcher.matches()) { |
||||||
|
return Integer.parseInt(matcher.group(1)); |
||||||
|
} |
||||||
|
throw new UnsupportedOperationException("not an array index fragment"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,278 @@ |
|||||||
|
package com.jayway.jsonassert; |
||||||
|
|
||||||
|
import com.jayway.jsonassert.impl.JsonPathImpl; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by IntelliJ IDEA. |
||||||
|
* User: kallestenflo |
||||||
|
* Date: 2/1/11 |
||||||
|
* Time: 10:08 AM |
||||||
|
*/ |
||||||
|
public class JsonPathTest { |
||||||
|
|
||||||
|
private static String TEST_DOCUMENT = "{ \"nullField\" : null, \"stringField\" : \"string-field\" , \"numberField\" : 1234 , \"doubleField\" : 12.34 , \"booleanField\" : true , \"subDocument\" : {\"subField\" : \"sub-field\"} , \"stringList\" : [\"ONE\", \"TWO\"], \"objectList\" : [{\"subField\" : \"sub-field-0\", \"subDoc\": {\"subField\": \"A\"}}, {\"subField\" : \"sub-field-1\", \"subDoc\": {\"subField\": \"B\"}}], \"listList\" : [[\"0.0\", \"0.1\"], [\"1.0\", \"1.1\"]], }"; |
||||||
|
private static String TEST_DOCUMENT_ARRAY = "{ \"listList\" : [[\"0.0\", \"0.1\"], [\"1.0\", \"1.1\"]], }"; |
||||||
|
private static String TEST_DEEP_PATH_DOCUMENT = "{ \"a\" : { \"b\" : { \"c\" : { \"say\" : \"hello\" } } }}"; |
||||||
|
private static String TEST_ARRAY = "[{\"name\" : \"name0\"}, {\"name\" : \"name1\"}]"; |
||||||
|
private static String TEST_DEEP_PATH_DOCUMENT_ARRAY = "{ \"arr0\" : [{ \"arr0_0\" : [{ \"arr0_0_0\" : [{\"val\": \"0A\"}, {\"val\": \"1A\"}] }, { \"arr0_0\" : [{ \"arr0_0_0\" : [{\"val\": \"1A\"}, {\"val\": \"1B\"}] }] } ] }"; |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_string_field_can_be_accessed() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("string-field", reader.getString("stringField")); |
||||||
|
assertEquals("string-field", reader.get("stringField")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void is_null_returns_true_for_null_fields() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertTrue(reader.isNull("nullField")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void is_null_returns_false_for_not_null_fields() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertFalse(reader.isNull("stringField")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_long_field_can_be_accessed() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertTrue(1234L == reader.getLong("numberField")); |
||||||
|
assertEquals(1234L, reader.get("numberField")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_double_field_can_be_accessed() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals(12.34D, reader.getDouble("doubleField"), 0.001); |
||||||
|
assertEquals(12.34D, reader.<Double>get("doubleField"), 0.001); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_boolean_field_can_be_accessed() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals(true, reader.getBoolean("booleanField")); |
||||||
|
assertEquals(true, reader.get("booleanField")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_path_can_be_checked_for_existence() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DEEP_PATH_DOCUMENT); |
||||||
|
|
||||||
|
assertTrue(reader.hasJsonPath("a.b.c.say")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_path_can_be_checked_for_non_existence() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DEEP_PATH_DOCUMENT); |
||||||
|
|
||||||
|
assertFalse(reader.hasJsonPath("a.b.c.FOO")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_string_field_can_be_accessed_in_a_nested_document() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("sub-field", reader.getString("subDocument.subField")); |
||||||
|
assertEquals("sub-field", reader.get("subDocument.subField")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_list_can_be_accessed_in_a_document() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals(2, reader.<String>getList("stringList").size()); |
||||||
|
assertEquals(2, reader.<List<String>>get("stringList").size()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_list_can_be_accessed_by_array_index() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("ONE", reader.getString("stringList[0]")); |
||||||
|
assertEquals("TWO", reader.getString("stringList[1]")); |
||||||
|
|
||||||
|
assertEquals("ONE", reader.get("stringList[0]")); |
||||||
|
assertEquals("TWO", reader.get("stringList[1]")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_list_can_be_accessed_by_groovy_index() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
|
||||||
|
assertEquals("ONE", reader.getString("stringList.get(0)")); |
||||||
|
assertEquals("TWO", reader.getString("stringList.get(1)")); |
||||||
|
|
||||||
|
assertEquals("ONE", reader.get("stringList.get(0)")); |
||||||
|
assertEquals("TWO", reader.get("stringList.get(1)")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_document_contained_in_a_list_can_be_accessed_by_array_index() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("sub-field-0", reader.getString("objectList[0].subField")); |
||||||
|
assertEquals("sub-field-0", reader.get("objectList[0].subField")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_document_contained_in_a_list_can_be_accessed_by_groovy_index() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("sub-field-0", reader.getString("objectList.get(0).subField")); |
||||||
|
assertEquals("sub-field-0", reader.get("objectList.get(0).subField")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void an_array_in_an_array_can_be_accessed_by_array_index() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT_ARRAY); |
||||||
|
|
||||||
|
assertEquals("0.0", reader.getString("listList[0][0]")); |
||||||
|
|
||||||
|
assertEquals("0.1", reader.getString("listList[0][1]")); |
||||||
|
assertEquals("1.0", reader.getString("listList[1][0]")); |
||||||
|
assertEquals("1.1", reader.getString("listList[1][1]")); |
||||||
|
|
||||||
|
assertEquals("0.0", reader.get("listList[0][0]")); |
||||||
|
assertEquals("0.1", reader.get("listList[0][1]")); |
||||||
|
assertEquals("1.0", reader.get("listList[1][0]")); |
||||||
|
assertEquals("1.1", reader.get("listList[1][1]")); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void an_array_in_an_array_can_be_accessed_by_groovy_index() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT_ARRAY); |
||||||
|
|
||||||
|
assertEquals("0.0", reader.getString("listList.get(0).get(0)")); |
||||||
|
assertEquals("0.1", reader.getString("listList.get(0).get(1)")); |
||||||
|
assertEquals("1.0", reader.getString("listList.get(1).get(0)")); |
||||||
|
assertEquals("1.1", reader.getString("listList.get(1).get(1)")); |
||||||
|
|
||||||
|
assertEquals("0.0", reader.get("listList.get(0).get(0)")); |
||||||
|
assertEquals("0.1", reader.get("listList.get(0).get(1)")); |
||||||
|
assertEquals("1.0", reader.get("listList.get(1).get(0)")); |
||||||
|
assertEquals("1.1", reader.get("listList.get(1).get(1)")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void an_array_with_documents_can_be_accessed_by_index() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_ARRAY); |
||||||
|
|
||||||
|
assertEquals("name0", reader.getString("[0].name")); |
||||||
|
assertEquals("name1", reader.getString("[1].name")); |
||||||
|
|
||||||
|
assertEquals("name0", reader.get("[0].name")); |
||||||
|
assertEquals("name1", reader.get("[1].name")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_nested_document_can_be_accessed_as_a_map() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("sub-field", reader.getMap("subDocument").get("subField")); |
||||||
|
|
||||||
|
assertEquals("sub-field", reader.<Map>get("subDocument").get("subField")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void a_deep_document_path_can_be_read() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DEEP_PATH_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("hello", reader.getString("a.b.c.say")); |
||||||
|
|
||||||
|
assertEquals("hello", reader.get("a.b.c.say")); |
||||||
|
} |
||||||
|
/* |
||||||
|
@Test(expected = InvalidPathException.class) |
||||||
|
public void exception_is_thrown_when_field_is_not_found() throws Exception { |
||||||
|
JSONReader reader = JsonQueryNew.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
reader.getString("invalidProperty"); |
||||||
|
} |
||||||
|
*/ |
||||||
|
|
||||||
|
@Test |
||||||
|
public void null_is_returned_when_field_is_not_found() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertNull(reader.getString("invalidProperty")); |
||||||
|
} |
||||||
|
|
||||||
|
public void null_is_when_field_is_not_found_with_get() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertNull(reader.get("invalidProperty")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void array_wildcard_property_extract() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals(2, reader.<String>getList("objectList[*].subField").size()); |
||||||
|
|
||||||
|
assertEquals(2, reader.<List<String>>get("objectList[*].subField").size()); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void array_wildcard_property_extract_new() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("A", reader.<String>getList("objectList[*].subDoc.subField").get(0)); |
||||||
|
assertEquals("B", reader.<String>getList("objectList[*].subDoc.subField").get(1)); |
||||||
|
|
||||||
|
assertEquals("A", reader.<List<String>>get("objectList[*].subDoc.subField").get(0)); |
||||||
|
assertEquals("B", reader.<List<String>>get("objectList[*].subDoc.subField").get(1)); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void list_to_string_returns_json() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("[\"ONE\",\"TWO\"]", reader.getList("stringList").toString()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void get_sub_reader_for_document() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("sub-field", reader.getReader("subDocument").getString("subField")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void get_sub_reader_for_list() throws Exception { |
||||||
|
JsonPath reader = JsonPathImpl.parse(TEST_DOCUMENT); |
||||||
|
|
||||||
|
assertEquals("ONE", reader.getReader("stringList").get("[0]")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
@ -0,0 +1,27 @@ |
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{ |
||||||
|
"arr": [ |
||||||
|
{ |
||||||
|
"obj":{"innerArr": [ |
||||||
|
{ |
||||||
|
"val": "bla_0" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"val": null |
||||||
|
} |
||||||
|
]} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"obj":{"innerArr": [ |
||||||
|
{ |
||||||
|
"val": "bla_4" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"val": "bla_5" |
||||||
|
} |
||||||
|
]} |
||||||
|
} |
||||||
|
] |
||||||
|
} |
Loading…
Reference in new issue