From c03c029c7e34e75d7427f6e176b6160a0dbb1a36 Mon Sep 17 00:00:00 2001 From: Kalle Stenflo Date: Thu, 9 Feb 2012 10:51:20 +0100 Subject: [PATCH] Code clean up. --- README | 34 +++++++++- changelog.txt | 24 ------- json-path/pom.xml | 18 ++---- .../java/com/jayway/jsonpath/JsonModel.java | 26 ++++++-- .../com/jayway/jsonpath/spi/JsonProvider.java | 6 +- .../jsonpath/spi/impl/JacksonProvider.java | 5 ++ .../jsonpath/spi/impl/JsonSmartProvider.java | 11 ++++ .../com/jayway/jsonpath/JsonModelTest.java | 64 ++++++++++++++++--- .../jayway/jsonpath/JsonPathExtendedTest.java | 60 +++++++++++++++++ .../jsonpath/SplitPathFragmentsTest.java | 3 - json-path/src/test/resources/js/path.html | 4 +- pom.xml | 11 +--- 12 files changed, 197 insertions(+), 69 deletions(-) delete mode 100644 changelog.txt create mode 100644 json-path/src/test/java/com/jayway/jsonpath/JsonPathExtendedTest.java diff --git a/README b/README index 88301efb..c7708923 100644 --- a/README +++ b/README @@ -1,4 +1,34 @@ Java DSL for reading and testing JSON documents. -COPY DEPENDENCIES : mvn clean compile dependency:copy-dependencies -DstripVersion -FONT LOGO : Santa Fe LET 50 \ No newline at end of file +------------------------------------------ +0.5.6 +------------------------------------------ +- Replaced regexp with custom tokenizer +- Removed static declaration of JSON_PARSER +- Introduced SPI for JsonProvider +- Elaborating new concept with JsonModel + +------------------------------------------ +0.5.5 +------------------------------------------ +- Improved JSON bracket notation. $['store']['book'][*]['author name'] + properties can also contain '.' eg $['store']['book'][*]['author.name'] + +------------------------------------------ +0.5.4 +------------------------------------------ +- Replaced com.googlecode.json-simple with net.minidev.json-smart +- Introduced different parse modes, JsonPath.SLACK_MODE and JsonPath.STRICT_MODE (the slack mode lets you use single quotes or even no quotes at all) + +------------------------------------------ +0.5.3 +------------------------------------------ +- Major refactoring +- JsonPath does not always produce a List as response + +------------------------------------------ +0.5.2 +------------------------------------------ +- Fixed issue that path was never considered definite if containing a ':' +- Bracket notation is now first class citizen $.foo.bar == $.['foo'].['bar'] +- Added JsonAsserter.assertNotDefined(String path) to allow checks for negative existence of a path diff --git a/changelog.txt b/changelog.txt deleted file mode 100644 index ddae1a1d..00000000 --- a/changelog.txt +++ /dev/null @@ -1,24 +0,0 @@ ------------------------------------------- -0.5.5 ------------------------------------------- -- Improved JSON bracket notation. $['store']['book'][*]['author name'] - properties can also contain '.' eg $['store']['book'][*]['author.name'] ------------------------------------------- -0.5.4 ------------------------------------------- -- Replaced com.googlecode.json-simple with net.minidev.json-smart -- Introduced different parse modes, JsonPath.SLACK_MODE and JsonPath.STRICT_MODE (the slack mode lets you use single quotes or even no quotes at all) - ------------------------------------------- -0.5.3 ------------------------------------------- -- Major refactoring -- JsonPath does not always produce a List as response - ------------------------------------------- -0.5.2 ------------------------------------------- - -- Fixed issue that path was never considered definite if containing a ':' -- Bracket notation is now first class citizen $.foo.bar == $.['foo'].['bar'] -- Added JsonAsserter.assertNotDefined(String path) to allow checks for negative existence of a path diff --git a/json-path/pom.xml b/json-path/pom.xml index 93bdb756..eb28e502 100644 --- a/json-path/pom.xml +++ b/json-path/pom.xml @@ -30,26 +30,21 @@ http://code.google.com/p/json-path/ - - org.codehaus.jackson - jackson-mapper-asl - - + net.minidev json-smart - commons-lang commons-lang + + org.codehaus.jackson + jackson-mapper-asl + provided + @@ -66,5 +61,6 @@ test + diff --git a/json-path/src/main/java/com/jayway/jsonpath/JsonModel.java b/json-path/src/main/java/com/jayway/jsonpath/JsonModel.java index d0b3f570..73af18fc 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/JsonModel.java +++ b/json-path/src/main/java/com/jayway/jsonpath/JsonModel.java @@ -14,7 +14,7 @@ public class JsonModel { private JsonProvider jsonProvider; - private JsonModel(String json) { + public JsonModel(String json) { this.jsonProvider = JsonProvider.getInstance(); this.jsonObject = jsonProvider.parse(json); } @@ -28,24 +28,36 @@ public class JsonModel { return new JsonModel(json); } - public T read(String jsonPath) { + public T get(String jsonPath) { JsonPath path = JsonPath.compile(jsonProvider, jsonPath); - return (T)read(path); + return (T) get(path); } - public T read(JsonPath jsonPath) { + public T get(JsonPath jsonPath) { return (T) jsonPath.read(jsonObject); } - public JsonModel get(String jsonPath) { + public String getJson(JsonPath jsonPath) { + return jsonProvider.toJson(jsonPath.read(jsonObject)); + } + + public JsonModel getModel(String jsonPath) { JsonPath path = JsonPath.compile(jsonProvider, jsonPath); - return get(path); + return getModel(path); } - public JsonModel get(JsonPath jsonPath) { + public JsonModel getModel(JsonPath jsonPath) { Object subModel = jsonPath.read(jsonObject); return new JsonModel(subModel); } + + public JsonProvider getJsonProvider() { + return jsonProvider; + } + + public String getJson(){ + return jsonProvider.toJson(jsonObject); + } } diff --git a/json-path/src/main/java/com/jayway/jsonpath/spi/JsonProvider.java b/json-path/src/main/java/com/jayway/jsonpath/spi/JsonProvider.java index af49f810..cc95eb42 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/spi/JsonProvider.java +++ b/json-path/src/main/java/com/jayway/jsonpath/spi/JsonProvider.java @@ -19,13 +19,15 @@ public abstract class JsonProvider { public abstract Object parse(String json) throws InvalidJsonException; + public abstract String toJson(Object obj); + public abstract Map createMap(); public abstract List createList(); public static JsonProvider getInstance(){ - //return new JsonSmartProvider(); - return new JacksonProvider(); + return new JsonSmartProvider(); + //return new JacksonProvider(); } /** diff --git a/json-path/src/main/java/com/jayway/jsonpath/spi/impl/JacksonProvider.java b/json-path/src/main/java/com/jayway/jsonpath/spi/impl/JacksonProvider.java index 728f60db..c3529ecd 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/spi/impl/JacksonProvider.java +++ b/json-path/src/main/java/com/jayway/jsonpath/spi/impl/JacksonProvider.java @@ -32,6 +32,11 @@ public class JacksonProvider extends JsonProvider { } } + @Override + public String toJson(Object obj) { + throw new UnsupportedOperationException(); + } + @Override public Map createMap() { return new HashMap(); diff --git a/json-path/src/main/java/com/jayway/jsonpath/spi/impl/JsonSmartProvider.java b/json-path/src/main/java/com/jayway/jsonpath/spi/impl/JsonSmartProvider.java index 718731ef..3495f714 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/spi/impl/JsonSmartProvider.java +++ b/json-path/src/main/java/com/jayway/jsonpath/spi/impl/JsonSmartProvider.java @@ -4,6 +4,7 @@ import com.jayway.jsonpath.InvalidJsonException; import com.jayway.jsonpath.spi.JsonProvider; import com.jayway.jsonpath.spi.Mode; import net.minidev.json.JSONArray; +import net.minidev.json.JSONAware; import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; @@ -48,6 +49,16 @@ public class JsonSmartProvider extends JsonProvider { } } + @Override + public String toJson(Object obj) { + if(!(obj instanceof JSONAware)){ + throw new InvalidJsonException(); + } + JSONAware aware = (JSONAware)obj; + + return aware.toJSONString(); + } + public Mode getMode() { return mode; } diff --git a/json-path/src/test/java/com/jayway/jsonpath/JsonModelTest.java b/json-path/src/test/java/com/jayway/jsonpath/JsonModelTest.java index ea45ca83..3401b2f4 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/JsonModelTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonModelTest.java @@ -1,9 +1,8 @@ package com.jayway.jsonpath; +import com.jayway.jsonpath.util.ScriptEngineJsonPath; import org.junit.Test; -import java.util.Map; - /** * Created by IntelliJ IDEA. * User: kallestenflo @@ -12,7 +11,7 @@ import java.util.Map; */ public class JsonModelTest { - public final static String DOCUMENT = + public final static String DOCUMENT = "{ \"store\": {\n" + " \"book\": [ \n" + " { \"category\": \"reference\",\n" + @@ -46,20 +45,65 @@ public class JsonModelTest { " }\n" + " }\n" + "}"; - + + public final static JsonModel MODEL = new JsonModel(DOCUMENT); + @Test public void a_path_can_be_read() throws Exception { - JsonModel pathReader = JsonModel.create(DOCUMENT); + JsonPath path = JsonPath.compile("$.store.book[*].title"); + + JsonModel model = new JsonModel(DOCUMENT); - Map book = pathReader.read("store.book[1]"); + Object result = model.get(path); - JsonModel pathReader1 = pathReader.get("store.book[1]"); + System.out.println(model.getJsonProvider().toJson(result)); - String author = pathReader1.read("author"); - System.out.println("d"); + } + + @Test + public void test2() throws Exception { + JsonPath path = JsonPath.compile("$.."); + + System.out.println(ScriptEngineJsonPath.eval(DOCUMENT, path.getPath())); + + JsonModel model = new JsonModel(DOCUMENT); + + System.out.println(model.getJson(path)); + } + + + @Test + public void test3() throws Exception { + JsonPath path = JsonPath.compile("$..[0]"); + + //System.out.println(ScriptEngineJsonPath.eval(DOCUMENT, path.getPath())); + System.out.println(MODEL.getJson(path)); } - + + @Test + public void test4() throws Exception { + JsonPath path = JsonPath.compile("$..*"); + + System.out.println(ScriptEngineJsonPath.eval(DOCUMENT, path.getPath())); + System.out.println("--------------------------------"); + + JsonModel model = new JsonModel(DOCUMENT); + System.out.println(model.getJson(path)); + } + + @Test + public void test5() throws Exception { + + JsonModel model = new JsonModel(DOCUMENT); + + JsonModel model2 = model.getModel("store.book[0]"); + + + System.out.println(model2.getJson()); + + } + } diff --git a/json-path/src/test/java/com/jayway/jsonpath/JsonPathExtendedTest.java b/json-path/src/test/java/com/jayway/jsonpath/JsonPathExtendedTest.java new file mode 100644 index 00000000..5055bb66 --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonPathExtendedTest.java @@ -0,0 +1,60 @@ +package com.jayway.jsonpath; + +import org.junit.Test; + +/** + * Created by IntelliJ IDEA. + * User: kallestenflo + * Date: 11/12/11 + * Time: 8:25 PM + */ +public class JsonPathExtendedTest { + + public final static String DOCUMENT = + "{ \"store\": {\n" + + " \"book\": [ \n" + + " { \"category\": \"reference\",\n" + + " \"author\": \"Nigel Rees\",\n" + + " \"title\": \"Sayings of the Century\",\n" + + " \"price\": 8.95\n" + + " },\n" + + " { \"category\": \"fiction\",\n" + + " \"author\": \"Evelyn Waugh\",\n" + + " \"title\": \"Sword of Honour\",\n" + + " \"price\": 12.99\n" + + " },\n" + + " { \"category\": \"fiction\",\n" + + " \"author\": \"Herman Melville\",\n" + + " \"title\": \"Moby Dick\",\n" + + " \"isbn\": \"0-553-21311-3\",\n" + + " \"price\": 8.99\n" + + " },\n" + + " { \"category\": \"fiction\",\n" + + " \"author\": \"J. R. R. Tolkien\",\n" + + " \"title\": \"The Lord of the Rings\",\n" + + " \"isbn\": \"0-395-19395-8\",\n" + + " \"price\": 22.99\n" + + " }\n" + + " ],\n" + + " \"bicycle\": {\n" + + " \"color\": \"red\",\n" + + " \"price\": 19.95,\n" + + " \"foo:bar\": \"fooBar\",\n" + + " \"dot.notation\": \"new\"\n" + + " }\n" + + " }\n" + + "}"; + + + @Test + public void test_1() throws Exception { + + + JsonPath path = JsonPath.compile("$.store.book[*].title"); + + + + + } + +} diff --git a/json-path/src/test/java/com/jayway/jsonpath/SplitPathFragmentsTest.java b/json-path/src/test/java/com/jayway/jsonpath/SplitPathFragmentsTest.java index d782dae0..b1d33e7c 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/SplitPathFragmentsTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/SplitPathFragmentsTest.java @@ -100,11 +100,8 @@ public class SplitPathFragmentsTest { private void assertPath(String path, Matcher> matcher) { System.out.println("PATH: " + path); - PathTokenizer tokenizer = new PathTokenizer(path, jsonProvider); - - for (String fragment : tokenizer.getFragments()) { System.out.println(fragment); } diff --git a/json-path/src/test/resources/js/path.html b/json-path/src/test/resources/js/path.html index d3b6e6a3..e1f3ce35 100644 --- a/json-path/src/test/resources/js/path.html +++ b/json-path/src/test/resources/js/path.html @@ -37,6 +37,7 @@ } }; + $('#src').append(JSON.stringify(window.doc, null, 4)); $('#btnEval').click(function(e) { $('#result').empty(); @@ -51,7 +52,8 @@ - +

+		
 		

 	
 
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 32291405..e8527b25 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
     json-path-parent
     pom
     0.5.6-SNAPSHOT
-    http://code.google.com/p/json-path
+    https://github.com/jayway/JsonPath
     json-path-parent-pom
     Java JsonPath implementation
     2011
@@ -154,18 +154,11 @@
 
     
         
-            
 
             
                 net.minidev
                 json-smart
-                1.0.9
+                1.0.9-1