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 4dc12167..5df8d986 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/JsonModel.java +++ b/json-path/src/main/java/com/jayway/jsonpath/JsonModel.java @@ -122,6 +122,10 @@ public class JsonModel { return jsonProvider.isMap(jsonObject); } + public void print(){ + System.out.println(toJson()); + } + /** * Check if this JsonModel has the given definite path * @@ -705,6 +709,13 @@ public class JsonModel { */ Double getDouble(String key); + /** + * Tries to convert the value associated with the key to an {@link String} + * @param key the key + * @return converted value + */ + String getString(String key); + /** * @see Map#putAll(java.util.Map) */ @@ -777,6 +788,9 @@ public class JsonModel { * @return this {@link ArrayOps} */ ArrayOps transform(Transformer> transformer); + + + ArrayOps each(Transformer transformer); /** * @see ListMappingModelReader @@ -847,6 +861,11 @@ public class JsonModel { return ConvertUtils.toDouble(get(key)); } + @Override + public String getString(String key) { + return ConvertUtils.toString(get(key)); + } + @Override public ObjectOps putAll(Map map) { getTargetObject(jsonPath, Map.class).putAll(map); @@ -929,6 +948,16 @@ public class JsonModel { return this; } + @Override + public ArrayOps each(Transformer transformer) { + + List targetObject = getTargetObject(jsonPath, List.class); + for(int i = 0; i < targetObject.size(); i++){ + targetObject.set(i, transformer.transform(targetObject.get(i))); + } + return this; + } + @Override public List toListOf(Class targetClass) { return new DefaultMappingModelReader(getTargetObject(jsonPath, List.class)).toListOf(targetClass); diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/ConvertUtils.java b/json-path/src/main/java/com/jayway/jsonpath/internal/ConvertUtils.java index eb5c4582..a46542a9 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/ConvertUtils.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/ConvertUtils.java @@ -75,4 +75,12 @@ public class ConvertUtils { throw new InvalidConversionException("Could not convert " + o.toString() + " to Double"); } } + + public static String toString(Object o) { + if(null == o){ + return null; + } + + return o.toString(); + } } diff --git a/json-path/src/test/java/com/jayway/jsonpath/JsonModelChainedCallsTest.java b/json-path/src/test/java/com/jayway/jsonpath/JsonModelChainedCallsTest.java new file mode 100644 index 00000000..a7f653c9 --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonModelChainedCallsTest.java @@ -0,0 +1,103 @@ +package com.jayway.jsonpath; + +import org.junit.Test; + +import java.util.List; +import java.util.Map; + +import static junit.framework.Assert.assertEquals; + +/** + * Created by IntelliJ IDEA. + * User: kallestenflo + * Date: 3/14/12 + * Time: 7:30 AM + */ +public class JsonModelChainedCallsTest { + + 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" + + " \"number\": 12,\n" + + " \"dot.notation\": \"new\"\n" + + " }\n" + + " }\n" + + "}"; + + + @Test + public void convert_and_map() throws Exception { + + JsonModel model = JsonModel.model(DOCUMENT); + + Transformer> transformer = new Transformer>() { + @Override + public Object transform(Map map) { + map.remove("isbn"); + map.put("author", "kalle"); + return map; + } + }; + + Book book = model.opsForObject("store.book[0]").transform(transformer).to(Book.class); + + assertEquals(book.author, "kalle"); + } + + + @Test + public void convert_each_and_map() throws Exception { + + JsonModel model = JsonModel.model(DOCUMENT); + + Transformer transformer = new Transformer() { + @Override + public Object transform(Object obj) { + Map map = (Map) obj; + map.remove("isbn"); + map.put("author", "kalle"); + return map; + } + }; + + List books = model.opsForArray("store.book").each(transformer).toList().of(Book.class); + + System.out.println(); + } + + + public static class Book { + public String category; + public String author; + public String title; + public Double price; + } + +}