Browse Source

Parent references

pull/1/head
U-SWNA\dbaldwin100 14 years ago
parent
commit
6fe9525d4e
  1. 28
      json-path-assert/src/main/java/com/jayway/jsonassert/JsonAssert.java
  2. 21
      json-path-assert/src/main/java/com/jayway/jsonassert/JsonAsserter.java
  3. 33
      json-path-assert/src/main/java/com/jayway/jsonassert/impl/JsonAsserterImpl.java
  4. 64
      json-path-assert/src/test/java/com/jayway/jsonassert/JsonAssertTest.java
  5. 34
      json-path/pom.xml
  6. 54
      json-path/src/main/java/com/jayway/jsonpath/JsonPath.java
  7. 49
      json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java
  8. 17
      json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java
  9. 23
      json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java
  10. 6
      json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterFactory.java
  11. 54
      json-path/src/main/java/com/jayway/jsonpath/filter/ListEvalFilter.java
  12. 30
      json-path/src/main/java/com/jayway/jsonpath/filter/ListFrontFilter.java
  13. 34
      json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java
  14. 34
      json-path/src/main/java/com/jayway/jsonpath/filter/ListPropertyFilter.java
  15. 19
      json-path/src/main/java/com/jayway/jsonpath/filter/ListTailFilter.java
  16. 21
      json-path/src/main/java/com/jayway/jsonpath/filter/ListWildcardFilter.java
  17. 47
      json-path/src/main/java/com/jayway/jsonpath/filter/PropertyFilter.java
  18. 16
      json-path/src/main/java/com/jayway/jsonpath/filter/RootFilter.java
  19. 39
      json-path/src/main/java/com/jayway/jsonpath/filter/TraverseFilter.java
  20. 29
      json-path/src/main/java/com/jayway/jsonpath/filter/WildcardPropertyFilter.java
  21. 149
      json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java
  22. 26
      json-path/src/test/java/com/jayway/jsonpath/ParserTest.java

28
json-path-assert/src/main/java/com/jayway/jsonassert/JsonAssert.java

@ -3,8 +3,11 @@ package com.jayway.jsonassert;
import com.jayway.jsonassert.impl.JsonAsserterImpl;
import com.jayway.jsonassert.impl.matcher.*;
import com.jayway.jsonpath.json.JsonFactory;
import net.minidev.json.parser.JSONParser;
import org.hamcrest.Matcher;
import org.hamcrest.core.IsNull;
import java.io.*;
import java.text.ParseException;
@ -18,7 +21,7 @@ import java.util.Map;
*/
public class JsonAssert {
private static JSONParser JSON_PARSER = new JSONParser();
private static JsonFactory JSON_PARSER = JsonFactory.getInstance();
public final static int STRICT_MODE = 0;
public final static int SLACK_MODE = -1;
@ -28,7 +31,7 @@ public class JsonAssert {
public static void setMode(int mode) {
if (mode != JsonAssert.mode) {
JsonAssert.mode = mode;
JSON_PARSER = new JSONParser(JsonAssert.mode);
}
}
@ -42,12 +45,12 @@ public class JsonAssert {
* @param json the JSON document to create a JSONAsserter for
* @return a JSON asserter initialized with the provided document
* @throws ParseException when the given JSON could not be parsed
* @throws com.jayway.jsonpath.json.ParseException
* @throws com.jayway.jsonpath.json.ParseException
*/
public static JsonAsserter with(String json) throws ParseException {
public static JsonAsserter with(String json) throws com.jayway.jsonpath.json.ParseException {
try {
return new JsonAsserterImpl(JSON_PARSER.parse(json));
} catch (net.minidev.json.parser.ParseException e) {
throw new ParseException(json, e.getPosition());
} catch (IOException e) {
throw new RuntimeException(e);
}
@ -59,13 +62,12 @@ public class JsonAssert {
* @param reader the reader of the json document
* @return a JSON asserter initialized with the provided document
* @throws ParseException when the given JSON could not be parsed
* @throws com.jayway.jsonpath.json.ParseException
*/
public static JsonAsserter with(Reader reader) throws ParseException, IOException {
try {
public static JsonAsserter with(Reader reader) throws ParseException, IOException, com.jayway.jsonpath.json.ParseException {
return new JsonAsserterImpl(JSON_PARSER.parse(convertReaderToString(reader)));
} catch (net.minidev.json.parser.ParseException e) {
throw new ParseException(e.toString(), e.getPosition());
}
}
/**
@ -74,8 +76,9 @@ public class JsonAssert {
* @param is the input stream
* @return a JSON asserter initialized with the provided document
* @throws ParseException when the given JSON could not be parsed
* @throws com.jayway.jsonpath.json.ParseException
*/
public static JsonAsserter with(InputStream is) throws ParseException, IOException {
public static JsonAsserter with(InputStream is) throws ParseException, IOException, com.jayway.jsonpath.json.ParseException {
Reader reader = new InputStreamReader(is);
return with(reader);
}
@ -97,6 +100,9 @@ public class JsonAssert {
public static Matcher<Collection<Object>> emptyCollection() {
return new IsEmptyCollection<Object>();
}
public static Matcher<Object> isnull() {
return new IsNull<Object>();
}
private static String convertReaderToString(Reader reader)
throws IOException {

21
json-path-assert/src/main/java/com/jayway/jsonassert/JsonAsserter.java

@ -2,6 +2,8 @@ package com.jayway.jsonassert;
import org.hamcrest.Matcher;
import com.jayway.jsonpath.json.JsonException;
/**
* User: kallestenflo
* Date: 1/24/11
@ -23,8 +25,10 @@ public interface JsonAsserter {
* @param matcher an expression, built of Matchers, specifying allowed values
* @param <T> the static type accepted by the matcher
* @return this to allow fluent assertion chains
* @throws AssertionError
* @throws JsonException
*/
<T> JsonAsserter assertThat(String path, Matcher<T> matcher);
<T> JsonAsserter assertThat(String path, Matcher<T> matcher) throws JsonException, AssertionError;
/**
* Asserts that object specified by path is equal to the expected value.
@ -34,8 +38,10 @@ public interface JsonAsserter {
* @param expected the expected value
* @param <T> the static type that should be returned by the path
* @return this to allow fluent assertion chains
* @throws AssertionError
* @throws JsonException
*/
<T> JsonAsserter assertEquals(String path, T expected);
<T> JsonAsserter assertEquals(String path, T expected) throws JsonException, AssertionError;
/**
* Checks that a path is not defined within a document. If the document contains the
@ -43,8 +49,9 @@ public interface JsonAsserter {
*
* @param path the path to make sure not exists
* @return this
* @throws JsonException
*/
JsonAsserter assertNotDefined(String path);
JsonAsserter assertNotDefined(String path) throws JsonException;
/**
@ -53,8 +60,10 @@ public interface JsonAsserter {
*
* @param path the json path specifying the value that should be null
* @return this to allow fluent assertion chains
* @throws AssertionError
* @throws JsonException
*/
JsonAsserter assertNull(String path);
JsonAsserter assertNull(String path) throws JsonException, AssertionError;
/**
* Asserts that object specified by path is NOT null. If it is, an AssertionError
@ -62,8 +71,10 @@ public interface JsonAsserter {
*
* @param path the json path specifying the value that should be NOT null
* @return this to allow fluent assertion chains
* @throws AssertionError
* @throws JsonException
*/
<T> JsonAsserter assertNotNull(String path);
<T> JsonAsserter assertNotNull(String path) throws JsonException, AssertionError;
/**
* Syntactic sugar to allow chaining assertions with a separating and() statement

33
json-path-assert/src/main/java/com/jayway/jsonassert/impl/JsonAsserterImpl.java

@ -3,6 +3,9 @@ package com.jayway.jsonassert.impl;
import com.jayway.jsonassert.JsonAsserter;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import org.hamcrest.Matcher;
import static java.lang.String.format;
@ -16,7 +19,7 @@ import static org.hamcrest.Matchers.*;
public class JsonAsserterImpl implements JsonAsserter {
private final Object jsonObject;
private final JsonElement jsonObject;
/**
@ -24,20 +27,23 @@ public class JsonAsserterImpl implements JsonAsserter {
*
* @param jsonObject the object to make asserts on
*/
public JsonAsserterImpl(Object jsonObject) {
public JsonAsserterImpl(JsonElement jsonObject) {
this.jsonObject = jsonObject;
}
/**
* {@inheritDoc}
* @throws AssertionError
* @throws JsonException
*/
@SuppressWarnings("unchecked")
public <T> JsonAsserter assertThat(String path, Matcher<T> matcher) {
public <T> JsonAsserter assertThat(String path, Matcher<T> matcher) throws JsonException, AssertionError {
String reason = "When processing json path: " + path;
if (!matcher.matches(JsonPath.<T>read(jsonObject, path))) {
JsonElement je = JsonPath.read(jsonObject, path);
if (!( (je == null && matcher.matches(je)) || (je.isContainer() && matcher.matches(je)) || matcher.matches(je.toObject()) ) ) {
System.out.println(JsonPath.read(jsonObject, path).toString());
@ -61,18 +67,21 @@ public class JsonAsserterImpl implements JsonAsserter {
/**
* {@inheritDoc}
* @throws AssertionError
* @throws JsonException
*/
public <T> JsonAsserter assertEquals(String path, T expected) {
public <T> JsonAsserter assertEquals(String path, T expected) throws JsonException, AssertionError {
return assertThat(path, equalTo(expected));
}
/**
* {@inheritDoc}
* @throws JsonException
*/
public JsonAsserter assertNotDefined(String path) {
Object o = JsonPath.read(jsonObject, path);
public JsonAsserter assertNotDefined(String path) throws JsonException {
JsonElement o = JsonPath.read(jsonObject, path);
if (o != null) {
if (!o.isJsonNull()) {
throw new AssertionError(format("Document contains the path <%s> but was expected not to.", path));
}
return this;
@ -80,15 +89,19 @@ public class JsonAsserterImpl implements JsonAsserter {
/**
* {@inheritDoc}
* @throws AssertionError
* @throws JsonException
*/
public JsonAsserter assertNull(String path) {
public JsonAsserter assertNull(String path) throws JsonException, AssertionError {
return assertThat(path, nullValue());
}
/**
* {@inheritDoc}
* @throws AssertionError
* @throws JsonException
*/
public <T> JsonAsserter assertNotNull(String path) {
public <T> JsonAsserter assertNotNull(String path) throws JsonException, AssertionError {
return assertThat(path, notNullValue());
}

64
json-path-assert/src/test/java/com/jayway/jsonassert/JsonAssertTest.java

@ -1,8 +1,15 @@
package com.jayway.jsonassert;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import com.jayway.jsonpath.json.JsonFactory;
import java.io.InputStream;
import java.io.InputStreamReader;
@ -14,7 +21,7 @@ import static org.hamcrest.Matchers.*;
* Date: 1/21/11
* Time: 4:04 PM
*/
public class JsonAssertTest {
public abstract class JsonAssertTest {
public final static String JSON =
"{ \"store\": {\n" +
@ -50,6 +57,15 @@ public class JsonAssertTest {
" }\n" +
"}";
protected JsonFactory factory = null;
@Before
public void init(){
init_factory();
}
protected void init_factory(){
}
@Test
public void links_document() throws Exception {
@ -88,42 +104,56 @@ public class JsonAssertTest {
@Test
public void list_content_can_be_asserted_with_matcher() throws Exception {
with(JSON).assertThat("$..book[*].author", hasItems("Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"));
with(JSON).assertThat("$..book[*].author", hasItems( factory.createJsonPrimitive("Nigel Rees"), factory.createJsonPrimitive("Evelyn Waugh"), factory.createJsonPrimitive("Herman Melville"),factory.createJsonPrimitive( "J. R. R. Tolkien")));
with(JSON).assertThat("$..author", hasItems("Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"))
.assertThat("$..author", is(collectionWithSize(equalTo(4))));
with(JSON).assertThat("$..author.(value)", hasItems( factory.createJsonPrimitive("Nigel Rees"), factory.createJsonPrimitive("Evelyn Waugh"), factory.createJsonPrimitive("Herman Melville"),factory.createJsonPrimitive( "J. R. R. Tolkien")))
.assertThat("$..author.(value)", is(collectionWithSize(equalTo(4))));
}
@Test
public void list_content_can_be_asserted_with_nested_matcher() throws Exception {
with(JSON).assertThat("$..book[*]", hasItems(hasEntry("author", "Nigel Rees"), hasEntry("author", "Evelyn Waugh")));
with(JSON).assertThat("$..book[*]", hasItems(hasEntry("author", factory.createJsonPrimitive("Nigel Rees")), hasEntry("author", factory.createJsonPrimitive("Evelyn Waugh"))));
}
@Test
public void map_content_can_be_asserted_with_matcher() throws Exception {
with(JSON).assertThat("$.store.book[0]", hasEntry("category", "reference"))
.assertThat("$.store.book[0]", hasEntry("title", "Sayings of the Century"))
with(JSON).assertThat("$.store.book[0]", hasEntry("category", w("reference")))
.assertThat("$.store.book[0]", hasEntry("title", w("Sayings of the Century")))
.and()
.assertThat("$..book[0]", hasEntry("category", "reference"))
.assertThat("$..book[0]", hasEntry("category", w("reference")))
.and()
.assertThat("$.store.book[0]", mapContainingKey(equalTo("category")))
.and()
.assertThat("$.store.book[0]", mapContainingValue(equalTo("reference")));
.assertThat("$.store.book[0]", mapContainingValue(equalTo( w("reference"))));
with(JSON).assertThat("$.['store'].['book'][0]", hasEntry("category", "reference"))
.assertThat("$.['store'].['book'][0]", hasEntry("title", "Sayings of the Century"))
with(JSON).assertThat("$.['store'].['book'][0]", hasEntry(w("category"), w("reference")))
.assertThat("$.['store'].['book'][0]", hasEntry("title", w("Sayings of the Century")))
.and()
.assertThat("$..['book'][0]", hasEntry("category", "reference"))
.assertThat("$..['book'][0]", hasEntry(w("category"), w("reference")))
.and()
.assertThat("$.['store'].['book'][0]", mapContainingKey(equalTo("category")))
.assertThat("$.['store'].['book'][0]", mapContainingKey(equalTo(("category"))))
.and()
.assertThat("$.['store'].['book'][0]", mapContainingValue(equalTo("reference")));
.assertThat("$.['store'].['book'][0]", mapContainingValue(equalTo(w("reference"))));
}
private JsonElement w(Object obj) throws JsonException {
return factory.createJsonPrimitive(obj);
}
private JsonElement[] w(Object ... objs) throws JsonException {
JsonElement je[]= new JsonElement[objs.length];
for(int i=0;i<objs.length;i++){
je[i] = w(objs[i]);
}
return je;
}
@Test
public void an_empty_collection() throws Exception {
with(JSON).assertThat("$.store.book[?(@.category = 'x')]", emptyCollection());
with(JSON).assertThat("$.store.book[?(@.category = 'x')]", isnull());
}
@Test
@ -140,12 +170,12 @@ public class JsonAssertTest {
@Test
public void invalid_path() throws Exception {
with(JSON).assertThat("$.store.book[*].fooBar", emptyCollection());
with(JSON).assertThat("$.store.book[*].fooBar.(value)", Matchers.<Object>nullValue());
}
@Test
public void path_including_wildcard_path_followed_by_another_path_concatenates_results_to_list() throws Exception {
with(getResourceAsStream("lotto.json")).assertThat("lotto.winners[*].winnerId", hasItems(23, 54));
with(getResourceAsStream("lotto.json")).assertThat("lotto.winners[*].winnerId", hasItems( factory.createJsonPrimitive(23), factory.createJsonPrimitive(54)));
}

34
json-path/pom.xml

@ -17,8 +17,8 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path-parent</artifactId>
<groupId>com.jayway.jsonpath</groupId>
<version>0.5.5-SNAPSHOT</version>
</parent>
<groupId>com.jayway.jsonpath</groupId>
@ -44,13 +44,43 @@
<artifactId>commons-lang</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>1.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.minidev</groupId>
<artifactId>json-smart</artifactId>
<version>1.0.6.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.11</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.11</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.11</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- test dependencies -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

54
json-path/src/main/java/com/jayway/jsonpath/JsonPath.java

@ -3,14 +3,19 @@ package com.jayway.jsonpath;
import com.jayway.jsonpath.filter.FilterOutput;
import com.jayway.jsonpath.filter.JsonPathFilterChain;
import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;
import net.minidev.json.parser.ParseException;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import com.jayway.jsonpath.json.JsonFactory;
import com.jayway.jsonpath.json.JsonParser;
import java.io.IOException;
import java.util.logging.Logger;
import net.minidev.json.parser.ParseException;
/**
* User: kalle stenflo
* Date: 2/2/11
@ -78,25 +83,28 @@ public class JsonPath {
public final static int STRICT_MODE = 0;
public final static int SLACK_MODE = -1;
private static int mode = SLACK_MODE;
// private static int mode = SLACK_MODE;
private static JsonFactory factory;
private final static Logger log = Logger.getLogger(JsonPath.class.getName());
private static JSONParser JSON_PARSER = new JSONParser(JsonPath.mode);
private JsonPathFilterChain filters;
/*
public static void setMode(int mode){
if(mode != JsonPath.mode){
JsonPath.mode = mode;
JSON_PARSER = new JSONParser(JsonPath.mode);
}
}
*/
/*
public static int getMode(){
return mode;
}
*/
/**
* Creates a new JsonPath.
@ -120,15 +128,17 @@ public class JsonPath {
* @param json a json Object
* @param <T>
* @return list of objects matched by the given path
* @throws JsonException
*/
public <T> T read(Object json) {
public JsonElement read(JsonElement json) throws JsonException {
FilterOutput filterOutput = filters.filter(json);
if (filterOutput == null || filterOutput.getResult() == null) {
return null;
}
return (T) filterOutput.getResult();
return filterOutput.getResult();
}
/**
@ -137,9 +147,10 @@ public class JsonPath {
* @param json a json string
* @param <T>
* @return list of objects matched by the given path
* @throws JsonException
*/
public <T> T read(String json) throws java.text.ParseException {
return (T) read(parse(json));
public JsonElement read(String json) throws java.text.ParseException, JsonException {
return read(parse(json));
}
/**
@ -159,9 +170,10 @@ public class JsonPath {
* @param jsonPath the json path
* @param <T>
* @return list of objects matched by the given path
* @throws JsonException
*/
public static <T> T read(String json, String jsonPath) throws java.text.ParseException {
return (T) compile(jsonPath).read(json);
public static JsonElement read(String json, String jsonPath) throws java.text.ParseException, JsonException {
return compile(jsonPath).read(json);
}
/**
@ -171,19 +183,21 @@ public class JsonPath {
* @param jsonPath the json path
* @param <T>
* @return list of objects matched by the given path
* @throws JsonException
*/
public static <T> T read(Object json, String jsonPath) {
return (T) compile(jsonPath).read(json);
public static JsonElement read(JsonElement json, String jsonPath) throws JsonException {
return compile(jsonPath).read(json);
}
private static Object parse(String json) throws java.text.ParseException {
public static JsonElement parse(String json) {
try {
return JSON_PARSER.parse(json);
} catch (ParseException e) {
throw new java.text.ParseException(json, e.getPosition());
return JsonFactory.getInstance().parse(json);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (com.jayway.jsonpath.json.ParseException e) {
throw new RuntimeException(e);
}
}
}

49
json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java

@ -1,7 +1,13 @@
package com.jayway.jsonpath.filter;
import java.util.ArrayList;
import java.util.List;
import com.jayway.jsonpath.json.JsonArray;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import com.jayway.jsonpath.json.JsonFactory;
import static java.lang.String.format;
/**
@ -11,27 +17,48 @@ import static java.lang.String.format;
*/
public class FilterOutput {
private final Object result;
private final List<JsonElement> result;
public FilterOutput(Object result) {
this.result = result;
public FilterOutput(JsonElement root) {
this.result = new ArrayList<JsonElement>();
result.add(root);
}
public boolean isList(){
public FilterOutput(List<JsonElement> result) {
this.result = result;
}
return (result instanceof List);
public FilterOutput() {
this.result = new ArrayList<JsonElement>();
}
public Object getResult() {
return result;
public JsonElement getResult() throws JsonException {
if(result.size()==0){
return null;
}
else if(result.size()==1){
return result.get(0);
}
public List<Object> getResultAsList() {
if(!isList()){
throw new RuntimeException(format("Can not convert a %s to a %s", result.getClass().getName(), List.class.getName()));
else{
JsonFactory fact = JsonFactory.getInstance();
JsonArray ja = fact.createJsonArray();
for(JsonElement ele:result)
ja.add(ele);
return ja;
}
return (List<Object>)result;
}
public JsonArray getResultAsList() throws JsonException {
return getResult().toJsonArray();
}
public List<JsonElement> getList() throws JsonException {
return result;
}

17
json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java

@ -1,7 +1,11 @@
package com.jayway.jsonpath.filter;
import java.util.ArrayList;
import java.util.List;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
/**
* Created by IntelliJ IDEA.
* User: kallestenflo
@ -9,5 +13,16 @@ import java.util.List;
* Time: 2:01 PM
*/
public abstract class JsonPathFilterBase {
public abstract FilterOutput apply(FilterOutput filterItems);
public FilterOutput apply(FilterOutput element) throws JsonException{
List<JsonElement> result = new ArrayList<JsonElement>();
for(JsonElement el : element.getList()){
List<JsonElement> out = apply(el);
if(out != null)
result.addAll(out);
}
return new FilterOutput(result);
}
public abstract List<JsonElement> apply(JsonElement element) throws JsonException;
public abstract String getPathSegment() throws JsonException;;
}

23
json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java

@ -1,9 +1,15 @@
package com.jayway.jsonpath.filter;
import com.jayway.jsonpath.InvalidPathException;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import org.apache.log4j.Logger;
/**
* User: kallestenflo
@ -13,11 +19,18 @@ import java.util.List;
public class JsonPathFilterChain {
private List<JsonPathFilterBase> filters;
private JsonElement payload = null;
private final Logger log = Logger.getLogger(JsonPathFilterChain.class);
public JsonPathFilterChain(List<String> pathFragments) {
filters = configureFilters(pathFragments);
}
public JsonPathFilterChain(List<String> pathFragments,JsonElement payload) {
filters = configureFilters(pathFragments);
this.payload = payload;
}
private List<JsonPathFilterBase> configureFilters(List<String> pathFragments) {
List<JsonPathFilterBase> configured = new LinkedList<JsonPathFilterBase>();
@ -28,20 +41,22 @@ public class JsonPathFilterChain {
return configured;
}
public FilterOutput filter(Object root) {
public FilterOutput filter(JsonElement root) throws JsonException {
FilterOutput out = new FilterOutput(root);
log.info(out.getResult().toString());
for (JsonPathFilterBase filter : filters) {
if (filter == null) {
throw new InvalidPathException();
}
if(out.getResult() == null){
if(out.getList() == null){
return null;
}
out = filter.apply(out);
if(out.getResult()!=null)
log.info(out.getResult().toString());
}
return out;
}
}

6
json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterFactory.java

@ -27,11 +27,17 @@ public class JsonPathFilterFactory {
return new TraverseFilter();
} else if (WildcardPropertyFilter.PATTERN.matcher(pathFragment).matches()) {
return new WildcardPropertyFilter();
}else if (M4PropertyFilter.PATTERN.matcher(pathFragment).matches()) {
return new M4PropertyFilter(pathFragment);
}
else if (TypeFilter.PATTERN.matcher(pathFragment).matches()) {
return new TypeFilter(pathFragment);
}else if (PropertyFilter.PATTERN.matcher(pathFragment).matches()) {
return new PropertyFilter(pathFragment);
}
return null;
}
}

54
json-path/src/main/java/com/jayway/jsonpath/filter/ListEvalFilter.java

@ -1,11 +1,17 @@
package com.jayway.jsonpath.filter;
import com.jayway.jsonpath.JsonUtil;
import com.jayway.jsonpath.eval.ExpressionEvaluator;
import net.minidev.json.JSONArray;
import com.jayway.jsonpath.json.JsonArray;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import com.jayway.jsonpath.json.JsonFactory;
import com.jayway.jsonpath.json.JsonObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -17,6 +23,8 @@ import java.util.regex.Pattern;
*/
public class ListEvalFilter extends JsonPathFilterBase {
//@Autowired
public JsonFactory factory = com.jayway.jsonpath.json.minidev.MiniJsonFactory.getInstance();
public static final Pattern PATTERN = Pattern.compile("\\[\\s?\\?\\s?\\(\\s?@.(\\w+)\\s?([=<>]+)\\s?(.*)\\s?\\)\\s?\\]"); //[?( @.title< 'ko')]
@ -28,19 +36,22 @@ public class ListEvalFilter extends JsonPathFilterBase {
@Override
public FilterOutput apply(FilterOutput filterItems) {
public List<JsonElement> apply(JsonElement element) throws JsonException {
List<JsonElement> result = new ArrayList<JsonElement>();
List<Object> result = new JSONArray();
for (Object item : filterItems.getResultAsList()) {
if (isMatch(item)) {
result.add(item);
if(element.isJsonArray()){
for(JsonElement subElement: element.toJsonArray()){
if (isMatch(subElement)) {
result.add(subElement);
}
}
}
return new FilterOutput(result);
return result;
}
private boolean isMatch(Object check) {
private boolean isMatch(JsonElement check) throws JsonException {
Matcher matcher = PATTERN.matcher(pathFragment);
if (matcher.matches()) {
@ -48,26 +59,33 @@ public class ListEvalFilter extends JsonPathFilterBase {
String operator = matcher.group(2);
String expected = matcher.group(3);
if (!JsonUtil.isMap(check)) {
if (!check.isJsonObject()) {
return false;
}
Map obj = JsonUtil.toMap(check);
if (!obj.containsKey(property)) {
JsonObject obj = check.toJsonObject();
if (!obj.hasProperty(property)) {
return false;
}
Object propertyValue = obj.get(property);
JsonElement propertyValue = obj.getProperty(property);
if (JsonUtil.isContainer(propertyValue)) {
if (propertyValue.isContainer()) {
return false;
}
String expression = propertyValue + " " + operator + " " + expected;
String expression = propertyValue.toObject() + " " + operator + " " + expected;
return ExpressionEvaluator.eval(propertyValue, operator, expected);
return ExpressionEvaluator.eval(propertyValue.toObject(), operator, expected);
}
return false;
}
@Override
public String getPathSegment() throws JsonException {
return pathFragment;
}
}

30
json-path/src/main/java/com/jayway/jsonpath/filter/ListFrontFilter.java

@ -1,12 +1,18 @@
package com.jayway.jsonpath.filter;
import net.minidev.json.JSONArray;
import com.jayway.jsonpath.json.JsonArray;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by IntelliJ IDEA.
* User: kallestenflo
@ -15,27 +21,34 @@ import java.util.regex.Pattern;
*/
public class ListFrontFilter extends JsonPathFilterBase {
//@Autowired
public com.jayway.jsonpath.json.JsonFactory factory = com.jayway.jsonpath.json.minidev.MiniJsonFactory.getInstance();
public static final Pattern PATTERN = Pattern.compile("\\[\\s?:(\\d+)\\s?\\]"); //[ :2 ]
private final String pathFragment;
@Override
public String getPathSegment() throws JsonException {
return pathFragment;
}
public ListFrontFilter(String pathFragment) {
this.pathFragment = pathFragment;
}
@Override
public FilterOutput apply(FilterOutput filterItems) {
List<Object> result = new JSONArray();
public List<JsonElement> apply(JsonElement element) throws JsonException {
List<JsonElement> result = new ArrayList<JsonElement>();
if(element.isJsonArray()){
Integer[] index = getListPullIndex();
for (int i : index) {
if (indexIsInRange(filterItems.getResultAsList(), i)) {
result.add(filterItems.getResultAsList().get(i));
if (indexIsInRange(element.toJsonArray(), i)) {
result.add(element.toJsonArray().get(i));
}
}
return new FilterOutput(result);
}
return result;
}
@ -64,4 +77,5 @@ public class ListFrontFilter extends JsonPathFilterBase {
return true;
}
}
}

34
json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java

@ -1,11 +1,16 @@
package com.jayway.jsonpath.filter;
import net.minidev.json.JSONArray;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
import com.jayway.jsonpath.json.JsonArray;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
/**
* Created by IntelliJ IDEA.
* User: kallestenflo
@ -17,31 +22,32 @@ public class ListIndexFilter extends JsonPathFilterBase {
public static final Pattern PATTERN = Pattern.compile("\\[(\\s?\\d+\\s?,?)+\\]"); //[1] OR [1,2,3]
private final String pathFragment;
@Override
public String getPathSegment() throws JsonException {
return pathFragment;
}
//@Autowired
public com.jayway.jsonpath.json.JsonFactory factory = com.jayway.jsonpath.json.minidev.MiniJsonFactory.getInstance();
public ListIndexFilter(String pathFragment) {
this.pathFragment = pathFragment;
}
@Override
public FilterOutput apply(FilterOutput filterItems) {
Object result = null;
public List<JsonElement> apply(JsonElement element) throws JsonException {
List<JsonElement> result = new ArrayList<JsonElement>();
Integer[] index = getArrayIndex();
if (index.length > 1) {
List<Object> tmp = new JSONArray();
if(element.isJsonArray()){
for (int i : index) {
if (indexIsInRange(filterItems.getResultAsList(), i)) {
tmp.add(filterItems.getResultAsList().get(i));
if (indexIsInRange(element.toJsonArray(), i)) {
result.add(element.toJsonArray().get(i));
}
}
result = tmp;
} else {
if (indexIsInRange(filterItems.getResultAsList(), index[0])) {
result = filterItems.getResultAsList().get(index[0]);
}
}
return new FilterOutput(result);
return result;
}
private boolean indexIsInRange(List list, int index) {

34
json-path/src/main/java/com/jayway/jsonpath/filter/ListPropertyFilter.java

@ -1,8 +1,11 @@
package com.jayway.jsonpath.filter;
import com.jayway.jsonpath.JsonUtil;
import net.minidev.json.JSONArray;
import com.jayway.jsonpath.json.JsonArray;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -15,6 +18,9 @@ import java.util.regex.Pattern;
*/
public class ListPropertyFilter extends JsonPathFilterBase {
//@Autowired
public com.jayway.jsonpath.json.JsonFactory factory = com.jayway.jsonpath.json.minidev.MiniJsonFactory.getInstance();
public static final Pattern PATTERN = Pattern.compile("\\[\\s?\\?\\s?\\(\\s?@\\.(\\w+)\\s?\\)\\s?\\]"); //[?(@.title)]
private final String pathFragment;
@ -22,23 +28,27 @@ public class ListPropertyFilter extends JsonPathFilterBase {
public ListPropertyFilter(String pathFragment) {
this.pathFragment = pathFragment;
}
@Override
public FilterOutput apply(FilterOutput filterItems) {
List<Object> result = new JSONArray();
public String getPathSegment() throws JsonException {
return pathFragment;
}
@Override
public List<JsonElement> apply(JsonElement element) throws JsonException {
List<JsonElement> result = new ArrayList<JsonElement>();
String prop = getFilterProperty();
for (Object item : filterItems.getResultAsList()) {
if (JsonUtil.isMap(item)) {
if (JsonUtil.toMap(item).containsKey(prop)) {
result.add(item);
if(element.isJsonArray()){
for(JsonElement subElement : element.toJsonArray()){
if (subElement.isJsonObject()) {
if (subElement.toJsonObject().hasProperty(prop)) {
result.add(subElement);
}
}
}
return new FilterOutput(result);
}
return result;
}

19
json-path/src/main/java/com/jayway/jsonpath/filter/ListTailFilter.java

@ -1,9 +1,13 @@
package com.jayway.jsonpath.filter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
/**
* Created by IntelliJ IDEA.
* User: kallestenflo
@ -25,11 +29,20 @@ public class ListTailFilter extends JsonPathFilterBase {
}
@Override
public FilterOutput apply(FilterOutput filterItems) {
public String getPathSegment() throws JsonException {
return pathFragment;
}
@Override
public List<JsonElement> apply(JsonElement element) throws JsonException {
List<JsonElement> result = new ArrayList<JsonElement>();
if(element.isJsonArray()){
int index = getTailIndex(element.toJsonArray().size());
result.add(element.toJsonArray().get(index));
}
int index = getTailIndex(filterItems.getResultAsList().size());
return result;
return new FilterOutput(filterItems.getResultAsList().get(index));
}

21
json-path/src/main/java/com/jayway/jsonpath/filter/ListWildcardFilter.java

@ -1,7 +1,12 @@
package com.jayway.jsonpath.filter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
/**
* Created by IntelliJ IDEA.
* User: kallestenflo
@ -13,7 +18,19 @@ public class ListWildcardFilter extends JsonPathFilterBase{
public static final Pattern PATTERN = Pattern.compile("\\[\\*\\]");
@Override
public FilterOutput apply(FilterOutput filterItems) {
return new FilterOutput(filterItems.getResultAsList());
public List<JsonElement> apply(JsonElement element) throws JsonException {
List<JsonElement> result = new ArrayList<JsonElement>();
if(element.isJsonArray()){
for(JsonElement ele : element.toJsonArray()){
result.add(ele);
}
}
return result;
}
@Override
public String getPathSegment() throws JsonException {
return null;
}
}

47
json-path/src/main/java/com/jayway/jsonpath/filter/PropertyFilter.java

@ -1,8 +1,13 @@
package com.jayway.jsonpath.filter;
import com.jayway.jsonpath.JsonUtil;
import net.minidev.json.JSONArray;
import com.jayway.jsonpath.json.JsonArray;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import com.jayway.jsonpath.json.JsonFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@ -19,36 +24,36 @@ public class PropertyFilter extends JsonPathFilterBase {
private final String pathFragment;
private JsonFactory factory = com.jayway.jsonpath.json.minidev.MiniJsonFactory.getInstance();
public PropertyFilter(String pathFragment) {
this.pathFragment = pathFragment;
}
@Override
public FilterOutput apply(FilterOutput filter) {
List<Object> result = new JSONArray();
public String getPathSegment() throws JsonException {
return null;
}
if (filter.isList()) {
for (Object current : filter.getResultAsList()) {
if (JsonUtil.toMap(current).containsKey(pathFragment)) {
@Override
public List<JsonElement> apply(JsonElement element) throws JsonException {
Object o = JsonUtil.toMap(current).get(pathFragment);
if (JsonUtil.isList(o)) {
result.addAll(JsonUtil.toList(o));
List<JsonElement> result = new ArrayList<JsonElement>();
} else {
result.add(JsonUtil.toMap(current).get(pathFragment));
if (element.isJsonObject() && element.toJsonObject().hasProperty(pathFragment)) {
JsonElement o = element.toJsonObject().getProperty(pathFragment);
if(o != null){
result.add(o);
}
else{
result.add(factory.createJsonNull(pathFragment,element));
}
}
return new FilterOutput(result);
} else {
Object mapValue = null;
if (JsonUtil.toMap(filter.getResult()).containsKey(pathFragment)) {
mapValue = JsonUtil.toMap(filter.getResult()).get(pathFragment);
}
return new FilterOutput(mapValue);
else if(element.isJsonObject()){
result.add(factory.createJsonNull(pathFragment,element));
}
return result;
}
}

16
json-path/src/main/java/com/jayway/jsonpath/filter/RootFilter.java

@ -1,8 +1,12 @@
package com.jayway.jsonpath.filter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
/**
* Created by IntelliJ IDEA.
* User: kallestenflo
@ -14,7 +18,15 @@ public class RootFilter extends JsonPathFilterBase{
public final static Pattern PATTERN = Pattern.compile("\\$");
@Override
public FilterOutput apply(FilterOutput root) {
return root;
public List<JsonElement> apply(JsonElement element) throws JsonException {
List<JsonElement> result = new ArrayList<JsonElement>();
result.add(element);
return result;
}
@Override
public String getPathSegment() throws JsonException {
return null;
}
}

39
json-path/src/main/java/com/jayway/jsonpath/filter/TraverseFilter.java

@ -1,8 +1,13 @@
package com.jayway.jsonpath.filter;
import com.jayway.jsonpath.JsonUtil;
import net.minidev.json.JSONArray;
import com.jayway.jsonpath.json.JsonArray;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import com.jayway.jsonpath.json.JsonFactory;
import com.jayway.jsonpath.json.JsonObject;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@ -16,33 +21,37 @@ public class TraverseFilter extends JsonPathFilterBase {
public final static Pattern PATTERN = Pattern.compile("\\.\\.");
@Override
public FilterOutput apply(FilterOutput filter) {
List<Object> result = new JSONArray();
traverse(filter.getResult(), result);
return new FilterOutput(result);
public List<JsonElement> apply(JsonElement element) throws JsonException {
List<JsonElement> result = new ArrayList<JsonElement>();
traverse(element, result);
return result;
}
private void traverse(Object container, List<Object> result) {
private void traverse(JsonElement container, List<JsonElement> result) throws JsonException {
if (JsonUtil.isMap(container)) {
if (container.isJsonObject()) {
result.add(container);
for (Object value : JsonUtil.toMap(container).values()) {
if (JsonUtil.isContainer(value)) {
for (JsonElement value : container.toJsonObject().getProperties()) {
if (value.isContainer()) {
traverse(value, result);
}
}
} else if (JsonUtil.isList(container)) {
} else if (container.isJsonArray()) {
for (Object value : JsonUtil.toList(container)) {
if (JsonUtil.isContainer(value)) {
for (JsonElement value : container.toJsonArray()) {
if ( value.isContainer()) {
traverse(value, result);
}
}
}
}
@Override
public String getPathSegment() throws JsonException {
return null;
}
}

29
json-path/src/main/java/com/jayway/jsonpath/filter/WildcardPropertyFilter.java

@ -1,8 +1,13 @@
package com.jayway.jsonpath.filter;
import com.jayway.jsonpath.JsonUtil;
import net.minidev.json.JSONArray;
import com.jayway.jsonpath.json.JsonArray;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import com.jayway.jsonpath.json.JsonFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@ -15,25 +20,29 @@ import java.util.regex.Pattern;
public class WildcardPropertyFilter extends JsonPathFilterBase {
public final static Pattern PATTERN = Pattern.compile("\\*");
private JsonFactory factory = com.jayway.jsonpath.json.minidev.MiniJsonFactory.getInstance();
@Override
public FilterOutput apply(FilterOutput filter) {
public String getPathSegment() throws JsonException {
return null;
}
List<Object> result = new JSONArray();
@Override
public List<JsonElement> apply(JsonElement element) throws JsonException {
List<JsonElement> result = new ArrayList<JsonElement>();
if (filter.isList()) {
for (Object current : filter.getResultAsList()) {
for (Object value : JsonUtil.toMap(current).values()) {
if (element.isJsonArray()) {
for (JsonElement current : element.toJsonArray()) {
for (JsonElement value : current.toJsonObject().getProperties()) {
result.add(value);
}
}
} else {
for (Object value : JsonUtil.toMap(filter.getResult()).values()) {
for (JsonElement value : element.toJsonObject().getProperties()){
result.add(value);
}
}
return new FilterOutput(result);
return result;
}
}

149
json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java

@ -1,7 +1,17 @@
package com.jayway.jsonpath;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.jayway.jsonpath.json.JsonArray;
import com.jayway.jsonpath.json.JsonElement;
import com.jayway.jsonpath.json.JsonException;
import com.jayway.jsonpath.json.JsonFactory;
import com.jayway.jsonpath.json.JsonObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -15,7 +25,7 @@ import static org.junit.Assert.*;
* Date: 2/2/11
* Time: 3:07 PM
*/
public class JsonPathTest {
public abstract class JsonPathTest {
public final static String ARRAY = "[{\"value\": 1},{\"value\": 2}, {\"value\": 3},{\"value\": 4}]";
@ -53,28 +63,87 @@ public class JsonPathTest {
" }\n" +
"}";
@Before
public void init_factory(){
}
@Test
public void filter_an_array() throws Exception {
List<Object> matches = JsonPath.read(ARRAY, "$.[?(@.value = 1)]");
JsonElement matches = JsonPath.read(ARRAY, "$.[?(@.value = 1)]");
assertEquals(1, matches.size());
assertEquals(true, matches.isJsonObject());
System.out.println(matches);
}
@Test
public void read_path_with_colon() throws Exception {
assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar"), "fooBar");
assertEquals(JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['foo:bar']"), "fooBar");
assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar").toObject(), "fooBar");
assertEquals(JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['foo:bar']").toObject(), "fooBar");
}
@Test
public void parent_ref() throws Exception {
String doc = "{foo:{biz:{id:1}}}";
assertEquals(JsonPath.read(doc, "$.foo.biz").toString(), "{\"id\":1}");
JsonElement j = JsonPath.read(doc, "$.foo.biz");
assertEquals(j.getParentReference().getParent().toString() , "{\"biz\":{\"id\":1}}");;
assertEquals(j.getParentReference().getParent().getParentReference().getParent().toString(), "{\"foo\":{\"biz\":{\"id\":1}}}");
doc = "{foo:{biz:[{Id:1},{Id:2},{Id:4,foo:1234}]}}";
JsonElement root = JsonPath.parse(doc);
assertEquals(JsonPath.read(doc, "$.foo.biz.[2].foo").toString(), "1234");
assertEquals(JsonPath.read(doc, "$.foo.biz.[2].foo").getParentReference().getParent().toJsonObject().get("Id").toString(), "4");
JsonElement doc_json = JsonFactory.getInstance().parse( "{foo:[[[1],2,3,4],1,2,3]}");
JsonElement je = JsonPath.read(doc_json, "$.foo[0][0]");
je.getParentReference().setReference( JsonFactory.getInstance().createJsonPrimitive("foo"));
assertEquals(doc_json.toString(),"{\"foo\":[[\"foo\",2,3,4],1,2,3]}");
}
@Test
public void type_test() throws Exception {
String doc = "{foo:{biz:{id:1}}}";
assertEquals(JsonPath.read(doc, "$.foo.biz.(object)").toString(), "{\"id\":1}");
assertEquals(JsonPath.read(doc, "$.foo.biz.(collection)"), null);
doc = "{foo:{biz:[{Id:1},{Id:2},{Id:4,foo:1234}]}}";
JsonElement root = JsonPath.parse(doc);
assertEquals(JsonPath.read(doc, "$.foo.biz.(collection)[2].foo.(value)").toString(), "1234");
}
@Test
public void read_document_from_root() throws Exception {
Map result = JsonPath.read(DOCUMENT, "$.store");
com.jayway.jsonpath.json.JsonObject result = JsonPath.read(DOCUMENT, "$.store").toJsonObject();
assertEquals(2, result.values().size());
assertEquals(2, result.getProperties().size());
}
@ -85,94 +154,110 @@ public class JsonPathTest {
JsonPath path = JsonPath.compile("$.store.book[1]");
Map map = path.read(DOCUMENT);
JsonElement map = path.read(DOCUMENT);
assertEquals("Evelyn Waugh", map.get("author"));
assertEquals("Evelyn Waugh", map.toJsonObject().get("author").toObject());
}
@Test
public void read_store_book_wildcard() throws Exception {
JsonPath path = JsonPath.compile("$.store.book[*]");
List<Object> list = path.read(DOCUMENT);
JsonElement list = path.read(DOCUMENT);
}
@Test
public void read_store_book_author() throws Exception {
assertThat(JsonPath.<List<String>>read(DOCUMENT, "$.store.book[0,1].author"), hasItems("Nigel Rees", "Evelyn Waugh"));
assertThat(JsonPath.<List<String>>read(DOCUMENT, "$.store.book[*].author"), hasItems("Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"));
assertThat(JsonPath.<List<String>>read(DOCUMENT, "$.['store'].['book'][*].['author']"), hasItems("Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"));
Iterable<String> l1 = toList(JsonPath.read(DOCUMENT, "$.store.book[0,1].author"));
assertThat(l1, hasItems("Nigel Rees", "Evelyn Waugh"));
Iterable<String> l2 = toList(JsonPath.read(DOCUMENT, "$.store.book[*].author"));
assertThat(l2, hasItems("Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"));
Iterable<String> l3 = toList(JsonPath.read(DOCUMENT, "$.['store'].['book'][*].['author']"));
assertThat(l3, hasItems("Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"));
}
private <T> List<T> toList(JsonElement read) throws JsonException {
List l = new ArrayList<T>();
for(JsonElement e: read.toJsonArray()){
l.add((T) e.toObject());
}
return l ;
}
@Test
public void all_authors() throws Exception {
assertThat(JsonPath.<List<String>>read(DOCUMENT, "$..author"), hasItems("Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"));
Iterable<String> l1 = toList(JsonPath.read(DOCUMENT, "$..author"));
assertThat(l1, hasItems("Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"));
}
@Test
public void all_store_properties() throws Exception {
List<Object> itemsInStore = JsonPath.read(DOCUMENT, "$.store.*");
JsonArray itemsInStore = JsonPath.read(DOCUMENT, "$.store.*").toJsonArray();
assertEquals(JsonPath.read(itemsInStore, "$.[0].[0].author"), "Nigel Rees");
assertEquals(JsonPath.read(itemsInStore, "$.[0][0].author"), "Nigel Rees");
assertEquals(JsonPath.read(itemsInStore, "$.[0].[0].author").toObject(), "Nigel Rees");
assertEquals(JsonPath.read(itemsInStore, "$.[0][0].author").toObject(), "Nigel Rees");
}
@Test
public void all_prices_in_store() throws Exception {
assertThat(JsonPath.<List<Double>>read(DOCUMENT, "$.store..price"), hasItems(8.95D, 12.99D, 8.99D, 19.95D));
assertThat(this.<Double>toList(JsonPath.read(DOCUMENT, "$.store..price")), hasItems(8.95D, 12.99D, 8.99D, 19.95D));
}
@Test
public void access_array_by_index_from_tail() throws Exception {
assertThat(JsonPath.<String>read(DOCUMENT, "$..book[(@.length-1)].author"), equalTo("J. R. R. Tolkien"));
assertThat(JsonPath.<String>read(DOCUMENT, "$..book[-1:].author"), equalTo("J. R. R. Tolkien"));
assertThat((String)JsonPath.read(DOCUMENT, "$..book[(@.length-1)].author").toObject(), equalTo("J. R. R. Tolkien"));
assertThat((String)JsonPath.read(DOCUMENT, "$..book[-1:].author").toObject(), equalTo("J. R. R. Tolkien"));
}
@Test
public void read_store_book_index_0_and_1() throws Exception {
assertThat(JsonPath.<List<String>>read(DOCUMENT, "$.store.book[0,1].author"), hasItems("Nigel Rees", "Evelyn Waugh"));
assertTrue(JsonPath.<List>read(DOCUMENT, "$.store.book[0,1].author").size() == 2);
assertThat(this.<String>toList(JsonPath.read(DOCUMENT, "$.store.book[0,1].author")), hasItems("Nigel Rees", "Evelyn Waugh"));
assertTrue(this.<String>toList(JsonPath.read(DOCUMENT, "$.store.book[0,1].author")).size() == 2);
}
@Test
public void read_store_book_pull_first_2() throws Exception {
assertThat(JsonPath.<List<String>>read(DOCUMENT, "$.store.book[:2].author"), hasItems("Nigel Rees", "Evelyn Waugh"));
assertTrue(JsonPath.<List>read(DOCUMENT, "$.store.book[:2].author").size() == 2);
assertThat(this.<String>toList(JsonPath.read(DOCUMENT, "$.store.book[:2].author")), hasItems("Nigel Rees", "Evelyn Waugh"));
assertTrue(this.<String>toList(JsonPath.read(DOCUMENT, "$.store.book[:2].author")).size() == 2);
}
@Test
public void read_store_book_filter_by_isbn() throws Exception {
assertThat(JsonPath.<List<String>>read(DOCUMENT, "$.store.book[?(@.isbn)].isbn"), hasItems("0-553-21311-3", "0-395-19395-8"));
assertTrue(JsonPath.<List>read(DOCUMENT, "$.store.book[?(@.isbn)].isbn").size() == 2);
assertThat(this.<String>toList(JsonPath.read(DOCUMENT, "$.store.book[?(@.isbn)].isbn")), hasItems("0-553-21311-3", "0-395-19395-8"));
assertTrue(this.<String>toList(JsonPath.read(DOCUMENT, "$.store.book[?(@.isbn)].isbn")).size() == 2);
}
@Test
public void all_books_cheaper_than_10() throws Exception {
assertThat(JsonPath.<List<String>>read(DOCUMENT, "$.store.book[?(@.price < 10)].title"), hasItems("Sayings of the Century", "Moby Dick"));
Object o = JsonPath.read(DOCUMENT, "$.store.book[?(@.price < 10)].title");
assertThat(this.<String>toList(JsonPath.read(DOCUMENT, "$.store.book[?(@.price < 10)].title")), hasItems("Sayings of the Century", "Moby Dick"));
}
@Test
public void all_books_with_category_reference() throws Exception {
assertThat(JsonPath.<List<String>>read(DOCUMENT, "$..book[?(@.category = 'reference')].title"), hasItems("Sayings of the Century"));
Object o = JsonPath.read(DOCUMENT, "$..book[?(@.category = 'reference')].title");
assertEquals(JsonPath.read(DOCUMENT, "$..book[?(@.category = 'reference')].title").toObject(), "Sayings of the Century");
}
@Test
public void all_members_of_all_documents() throws Exception {
List<String> all = JsonPath.read(DOCUMENT, "$..*");
JsonPath.read(DOCUMENT, "$..*");
}
@Test
@ -182,10 +267,10 @@ public class JsonPathTest {
assertNull(res);
res = JsonPath.read(DOCUMENT, "$.store.book[1, 200].author");
JsonElement res2 = JsonPath.read(DOCUMENT, "$.store.book[1, 200].author");
assertThat((List<String>)res, hasItems("Evelyn Waugh"));
assertEquals(res2.toObject(), "Evelyn Waugh");
//assertNull(();
}

26
json-path/src/test/java/com/jayway/jsonpath/ParserTest.java

@ -1,5 +1,6 @@
package com.jayway.jsonpath;
import org.junit.Ignore;
import org.junit.Test;
import java.text.ParseException;
@ -12,6 +13,7 @@ import static junit.framework.Assert.assertEquals;
* Date: 6/25/11
* Time: 4:16 PM
*/
public class ParserTest {
@ -19,33 +21,25 @@ public class ParserTest {
private final static String NO_QUOTE_JSON = "{lhs: 1.0 U.S. dollar, rhs: 6.39778892, error: null, icc: true}";
@Test
@Ignore
public void default_mode_is_SLACK_MODE() throws Exception {
assertEquals(JsonPath.SLACK_MODE, JsonPath.getMode());
// assertEquals(JsonPath.SLACK_MODE, JsonPath.getMode());
}
@Test
@Ignore
public void slack_mode_allows_single_quotes() throws Exception {
assertEquals(JsonPath.read(SINGLE_QUOTE_JSON, "lhs"), "1.0 U.S. dollar");
assertEquals(JsonPath.read(SINGLE_QUOTE_JSON, "rhs"), 6.39778892D);
assertEquals(JsonPath.read(SINGLE_QUOTE_JSON, "lhs").toPrimitive(), "1.0 U.S. dollar");
assertEquals(JsonPath.read(SINGLE_QUOTE_JSON, "rhs").toPrimitive(), 6.39778892D);
}
@Test
@Ignore
public void slack_mode_allows_no_quotes() throws Exception {
assertEquals(JsonPath.read(NO_QUOTE_JSON, "lhs"), "1.0 U.S. dollar");
assertEquals(JsonPath.read(NO_QUOTE_JSON, "rhs"), 6.39778892D);
}
@Test(expected = ParseException.class)
public void strict_mode_does_not_accept_single_quotes() throws Exception {
JsonPath.setMode(JsonPath.STRICT_MODE);
JsonPath.read(SINGLE_QUOTE_JSON, "lhs");
assertEquals(JsonPath.read(NO_QUOTE_JSON, "lhs").getWrappedElement(), "1.0 U.S. dollar");
assertEquals(JsonPath.read(NO_QUOTE_JSON, "rhs").getWrappedElement(), 6.39778892D);
}
@Test(expected = ParseException.class)
public void strict_mode_does_not_accept_no_quotes() throws Exception {
JsonPath.setMode(JsonPath.STRICT_MODE);
JsonPath.read(NO_QUOTE_JSON, "lhs");
}
}

Loading…
Cancel
Save