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 2ab97397..c6a711f9 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/JsonModel.java +++ b/json-path/src/main/java/com/jayway/jsonpath/JsonModel.java @@ -17,9 +17,8 @@ package com.jayway.jsonpath; import com.jayway.jsonpath.internal.PathToken; import com.jayway.jsonpath.spi.JsonProvider; import com.jayway.jsonpath.spi.JsonProviderFactory; +import com.jayway.jsonpath.spi.MappingProviderFactory; import org.apache.commons.io.IOUtils; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.type.CollectionType; import java.io.IOException; import java.io.InputStream; @@ -38,8 +37,6 @@ import static org.apache.commons.lang.Validate.notNull; */ public class JsonModel { - private static ObjectMapper objectMapper; - private Object jsonObject; // -------------------------------------------------------- @@ -248,19 +245,6 @@ public class JsonModel { // Private helpers // // -------------------------------------------------------- - private static ObjectMapper getObjectMapper() { - if (JsonModel.objectMapper == null) { - synchronized (JsonModel.class) { - try { - Class.forName("org.codehaus.jackson.map.ObjectMapper"); - } catch (ClassNotFoundException e) { - throw new RuntimeException("org.codehaus.jackson.map.ObjectMapper not found on classpath. This is an optional dependency needed for POJO conversions."); - } - JsonModel.objectMapper = new ObjectMapper(); - } - } - return JsonModel.objectMapper; - } private T getTargetObject(JsonPath jsonPath, Class clazz) { notNull(jsonPath, "jsonPath can not be null"); @@ -292,9 +276,7 @@ public class JsonModel { // Interfaces // // -------------------------------------------------------- - public interface MappingModelReader extends ListMappingModelReader, ObjectMappingModelReader { - } public interface ObjectMappingModelReader { T to(Class targetClass); @@ -310,6 +292,10 @@ public class JsonModel { Set toSetOf(Class targetClass); } + public interface MappingModelReader extends ListMappingModelReader, ObjectMappingModelReader { + + } + public interface ObjectOps { Map getTarget(); @@ -432,12 +418,10 @@ public class JsonModel { } private static class DefaultMappingModelReader implements MappingModelReader { - private ObjectMapper objectMapper; private Object model; private DefaultMappingModelReader(Object model) { this.model = model; - this.objectMapper = JsonModel.getObjectMapper(); } @Override @@ -455,8 +439,7 @@ public class JsonModel { if (!(model instanceof List)) { model = asList(model); } - CollectionType colType = objectMapper.getTypeFactory().constructCollectionType(List.class, targetClass); - return objectMapper.convertValue(model, colType); + return MappingProviderFactory.getInstance().convertValue(model, List.class, targetClass); } @Override @@ -466,13 +449,12 @@ public class JsonModel { setModel.add(model); model = setModel; } - CollectionType colType = objectMapper.getTypeFactory().constructCollectionType(Set.class, targetClass); - return objectMapper.convertValue(model, colType); + return MappingProviderFactory.getInstance().convertValue(model, Set.class, targetClass); } @Override public T to(Class targetClass) { - return objectMapper.convertValue(model, targetClass); + return MappingProviderFactory.getInstance().convertValue(model, targetClass); } diff --git a/json-path/src/main/java/com/jayway/jsonpath/spi/JsonProviderFactory.java b/json-path/src/main/java/com/jayway/jsonpath/spi/JsonProviderFactory.java index d94fe200..e6fb0b43 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/spi/JsonProviderFactory.java +++ b/json-path/src/main/java/com/jayway/jsonpath/spi/JsonProviderFactory.java @@ -1,6 +1,6 @@ package com.jayway.jsonpath.spi; -import com.jayway.jsonpath.spi.impl.JsonSmartProvider; +import com.jayway.jsonpath.spi.impl.JsonSmartJsonProvider; /** * Created by IntelliJ IDEA. @@ -11,7 +11,7 @@ import com.jayway.jsonpath.spi.impl.JsonSmartProvider; public abstract class JsonProviderFactory { public static JsonProvider getInstance() { - return new JsonSmartProvider(); + return new JsonSmartJsonProvider(); } } diff --git a/json-path/src/main/java/com/jayway/jsonpath/spi/MappingProvider.java b/json-path/src/main/java/com/jayway/jsonpath/spi/MappingProvider.java new file mode 100644 index 00000000..3db0c084 --- /dev/null +++ b/json-path/src/main/java/com/jayway/jsonpath/spi/MappingProvider.java @@ -0,0 +1,24 @@ +package com.jayway.jsonpath.spi; + +import org.codehaus.jackson.map.type.CollectionType; +import org.codehaus.jackson.map.type.TypeFactory; +import org.codehaus.jackson.map.type.TypeModifier; +import org.codehaus.jackson.map.type.TypeParser; +import org.codehaus.jackson.type.JavaType; + +import java.util.Collection; + +/** + * Created by IntelliJ IDEA. + * User: kallestenflo + * Date: 3/5/12 + * Time: 11:03 AM + */ +public interface MappingProvider { + + + public T convertValue(Object fromValue, Class toValueType) throws IllegalArgumentException; + + public , E> T convertValue(Object fromValue, Class collectionType, Class elementType) throws IllegalArgumentException; + +} diff --git a/json-path/src/main/java/com/jayway/jsonpath/spi/MappingProviderFactory.java b/json-path/src/main/java/com/jayway/jsonpath/spi/MappingProviderFactory.java new file mode 100644 index 00000000..91019c8b --- /dev/null +++ b/json-path/src/main/java/com/jayway/jsonpath/spi/MappingProviderFactory.java @@ -0,0 +1,31 @@ +package com.jayway.jsonpath.spi; + +import com.jayway.jsonpath.spi.impl.JacksonProvider; + +/** + * Created by IntelliJ IDEA. + * User: kallestenflo + * Date: 3/5/12 + * Time: 11:03 AM + */ +public class MappingProviderFactory { + + private static MappingProvider mappingProvider; + + static { + try { + Class.forName("org.codehaus.jackson.map.ObjectMapper"); + + mappingProvider = new JacksonProvider(); + } catch (ClassNotFoundException e) { + throw new RuntimeException("org.codehaus.jackson.map.ObjectMapper not found on classpath. This is an optional dependency needed for POJO conversions.", e); + } + } + + + + + public static MappingProvider getInstance() { + return mappingProvider; + } +} 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 3f6b9605..b238a65d 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 @@ -16,21 +16,22 @@ package com.jayway.jsonpath.spi.impl; import com.jayway.jsonpath.InvalidJsonException; import com.jayway.jsonpath.spi.JsonProvider; +import com.jayway.jsonpath.spi.MappingProvider; import com.jayway.jsonpath.spi.Mode; import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.type.CollectionType; import java.io.IOException; import java.io.InputStream; import java.io.Reader; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author Kalle Stenflo */ -public class JacksonProvider extends AbstractJsonProvider { +public class JacksonProvider extends AbstractJsonProvider implements MappingProvider{ + + private ObjectMapper objectMapper = new ObjectMapper(); @Override public Mode getMode() { return Mode.STRICT; @@ -39,7 +40,7 @@ public class JacksonProvider extends AbstractJsonProvider { @Override public Object parse(String json) throws InvalidJsonException { try { - return new ObjectMapper().readValue(json, Object.class); + return objectMapper.readValue(json, Object.class); } catch (IOException e) { throw new InvalidJsonException(e); } @@ -48,7 +49,7 @@ public class JacksonProvider extends AbstractJsonProvider { @Override public Object parse(Reader jsonReader) throws InvalidJsonException { try { - return new ObjectMapper().readValue(jsonReader, Object.class); + return objectMapper.readValue(jsonReader, Object.class); } catch (IOException e) { throw new InvalidJsonException(e); } @@ -57,7 +58,7 @@ public class JacksonProvider extends AbstractJsonProvider { @Override public Object parse(InputStream jsonStream) throws InvalidJsonException { try { - return new ObjectMapper().readValue(jsonStream, Object.class); + return objectMapper.readValue(jsonStream, Object.class); } catch (IOException e) { throw new InvalidJsonException(e); } @@ -77,4 +78,23 @@ public class JacksonProvider extends AbstractJsonProvider { public List createList() { return new LinkedList(); } + + //------------------------------------------------------------------- + // + // Mapping provider + // + //------------------------------------------------------------------- + + @Override + public T convertValue(Object fromValue, Class toValueType) throws IllegalArgumentException { + return objectMapper.convertValue(fromValue, toValueType); + } + + @Override + @SuppressWarnings({"unchecked"}) + public , E> T convertValue(Object fromValue, Class collectionType, Class elementType) throws IllegalArgumentException { + CollectionType colType = objectMapper.getTypeFactory().constructCollectionType(collectionType, elementType); + + return (T)objectMapper.convertValue(fromValue, colType); + } } 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/JsonSmartJsonProvider.java similarity index 91% rename from json-path/src/main/java/com/jayway/jsonpath/spi/impl/JsonSmartProvider.java rename to json-path/src/main/java/com/jayway/jsonpath/spi/impl/JsonSmartJsonProvider.java index 12df3199..3bad6989 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/JsonSmartJsonProvider.java @@ -15,15 +15,12 @@ package com.jayway.jsonpath.spi.impl; 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; -import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; @@ -33,17 +30,17 @@ import java.util.Map; /** * @author Kalle Stenflo */ -public class JsonSmartProvider extends AbstractJsonProvider { +public class JsonSmartJsonProvider extends AbstractJsonProvider { private Mode mode; private JSONParser parser; - public JsonSmartProvider() { + public JsonSmartJsonProvider() { this(Mode.SLACK); } - public JsonSmartProvider(Mode mode) { + public JsonSmartJsonProvider(Mode mode) { this.mode = mode; this.parser = new JSONParser(mode.intValue()); }