package org.springframework.data.simpledb.core.entity.json; import java.io.IOException; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.annotate.JsonAutoDetect; import org.codehaus.jackson.annotate.JsonMethod; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.mrbean.MrBeanModule; import org.springframework.data.mapping.model.MappingException; import org.springframework.util.Assert; /** * Marshall and unmarshall objects, collections and map field wrappers */ public final class JsonMarshaller { static class JsonMarshallerHolder { private static JsonMarshaller instance = new JsonMarshaller(); } private ObjectMapper jsonMapper; private JsonMarshaller() { JsonFactory factory = new JsonFactory(); jsonMapper = new ObjectMapper(factory); jsonMapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.NON_FINAL, "@class"); JsonUnknownPropertyHandler jsonUnknownPropertyHandler = new JsonUnknownPropertyHandler(); jsonMapper.getDeserializationConfig().addHandler(jsonUnknownPropertyHandler); jsonMapper.registerModule(new MrBeanModule()); } public static JsonMarshaller getInstance() { return JsonMarshallerHolder.instance; } static JsonMarshaller createNew(){ return new JsonMarshaller(); } public <T> T unmarshall(String jsonString, Class<?> objectType) { Assert.notNull(jsonString); try { return (T) jsonMapper.readValue(jsonString, objectType); } catch(IOException e) { throw new MappingException("Could not unmarshall object : " + jsonString, e); } } public <T> String marshall(T input) { Assert.notNull(input); jsonMapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY); jsonMapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.NON_FINAL, "@class"); try { return jsonMapper.writeValueAsString(input); } catch(Exception e) { throw new MappingException(e.getMessage(), e); } } }