adding jackson key serializer for maps
Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/ed28ffae Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/ed28ffae Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/ed28ffae Branch: refs/heads/ODE-912 Commit: ed28ffaeb4f57b4b65d6431b55b4ae354569043f Parents: 3da01a1 Author: fangzhen <[email protected]> Authored: Thu Jul 24 14:53:45 2014 +0800 Committer: fangzhen <[email protected]> Committed: Thu Jul 24 14:53:45 2014 +0800 ---------------------------------------------------------------------- .../ode/bpel/obj/serde/JsonOmDeserializer.java | 4 ++ .../ode/bpel/obj/serde/JsonOmSerializer.java | 7 ++++ .../bpel/obj/serde/KeyAsJsonDeserializer.java | 22 +++++++++++ .../ode/bpel/obj/serde/KeyAsJsonSerializer.java | 30 +++++++++++++++ .../bpel/obj/serde/jacksonhack/JacksonTest.java | 40 +++++++++++++++++++- 5 files changed, 101 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java index 40345fe..3141c0a 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java @@ -2,10 +2,12 @@ package org.apache.ode.bpel.obj.serde; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.util.HashMap; import java.util.Map; import javax.wsdl.OperationType; +import javax.xml.namespace.QName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -71,6 +73,8 @@ public class JsonOmDeserializer implements OmDeserializer { (JsonDeserializer) deserializers.get(d)); } simpleModule.setDeserializerModifier(new OModelDeserModifier()); + simpleModule.addKeyDeserializer(Object.class, new KeyAsJsonDeserializer()); + simpleModule.addKeyDeserializer(String.class, new KeyAsJsonDeserializer()); mapper.registerModule(simpleModule); wrapper = mapper.readValue(is, OProcessWrapper.class); http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java index 1daa427..c5503fc 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java @@ -3,13 +3,16 @@ package org.apache.ode.bpel.obj.serde; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Type; +import java.net.URI; import java.util.HashMap; import java.util.Map; import javax.wsdl.OperationType; +import javax.xml.namespace.QName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.ode.bpel.elang.xpath10.obj.OXPath10Expression; import org.apache.ode.bpel.obj.OProcessWrapper; import org.apache.ode.bpel.obj.serde.jacksonhack.TypeBeanSerializerFactory; import org.apache.ode.utils.NSContext; @@ -70,6 +73,10 @@ public class JsonOmSerializer implements OmSerializer { simpleModule.addSerializer((Class) ss, (JsonSerializer) serializers.get(ss)); } +// simpleModule.addKeySerializer(QName.class, new KeyAsJsonSerializer()); +// simpleModule.addKeySerializer(URI.class, new KeyAsJsonSerializer()); +// simpleModule.addKeySerializer(OXPath10Expression.SigGetVariableData.class, new KeyAsJsonSerializer()); + simpleModule.addKeySerializer(Object.class, new KeyAsJsonSerializer()); mapper.registerModule(simpleModule); mapper.enable(SerializationFeature.INDENT_OUTPUT); http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonDeserializer.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonDeserializer.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonDeserializer.java new file mode 100644 index 0000000..2baa787 --- /dev/null +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonDeserializer.java @@ -0,0 +1,22 @@ +package org.apache.ode.bpel.obj.serde; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.KeyDeserializer; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class KeyAsJsonDeserializer extends KeyDeserializer{ + static ObjectMapper mapper = new ObjectMapper(); + static { + mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + } + @Override + public Object deserializeKey(String key, DeserializationContext ctxt) + throws IOException, JsonProcessingException { + return mapper.readValue(key, Object.class); + } + + +} http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonSerializer.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonSerializer.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonSerializer.java new file mode 100644 index 0000000..ede595e --- /dev/null +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonSerializer.java @@ -0,0 +1,30 @@ +package org.apache.ode.bpel.obj.serde; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; + +public class KeyAsJsonSerializer extends JsonSerializer<Object> { + static ObjectMapper mapper = new ObjectMapper(); + static { + mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + } + @Override + public void serialize(Object value, JsonGenerator jgen, + SerializerProvider provider) throws IOException, + JsonProcessingException { + String json; + if (value instanceof String) { + json = (String)value; + }else{ + json = mapper.writeValueAsString(value); + } + json = mapper.writeValueAsString(value); + jgen.writeFieldName(json); + } + +} http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java b/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java index 2756cc1..ae92799 100644 --- a/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java +++ b/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java @@ -8,13 +8,22 @@ import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; +import javax.xml.namespace.QName; + +import org.apache.ode.bpel.obj.serde.KeyAsJsonDeserializer; +import org.apache.ode.bpel.obj.serde.KeyAsJsonSerializer; import org.junit.Test; +import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; public class JacksonTest { /** @@ -26,14 +35,14 @@ public class JacksonTest { @Test public void testReference() throws JsonGenerationException, JsonMappingException, IOException { - Map<String, Object> map = new LinkedHashMap<String, Object>(); + Map<Object, Object> map = new LinkedHashMap<Object, Object>(); A a = new A(); a.next = a; a.val = 100; map.put("i1", 100); map.put("i2", a); map.put("i4", a); - Map<String, Object> map2 = new LinkedHashMap<String, Object>(); + Map<Object, Object> map2 = new LinkedHashMap<Object, Object>(); String s = "a string"; map2.put("i31", s); map2.put("i33", s); @@ -47,6 +56,7 @@ public class JacksonTest { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializerFactory(TypeBeanSerializerFactory.instance); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + mapper.enable(SerializationFeature.INDENT_OUTPUT); ByteArrayOutputStream os = new ByteArrayOutputStream(); mapper.writeValue(os, map); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); @@ -93,5 +103,31 @@ public class JacksonTest { return parent; } } + static class C{ + @JsonSerialize(keyUsing=KeyAsJsonSerializer.class) + @JsonDeserialize(keyUsing=KeyAsJsonDeserializer.class) + Map<Object, Object> map = new LinkedHashMap<Object, Object>(); + + } + @Test + public void testMapTypeInfo() throws JsonParseException, JsonMappingException, IOException{ + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializerFactory(TypeBeanSerializerFactory.instance); + mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + mapper.enable(SerializationFeature.INDENT_OUTPUT); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + + C c = new C(); + QName qname = new QName("uri","localtest"); + c.map.put(qname, qname); + mapper.writeValue(os, c); + ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); + ObjectMapper m2 = new ObjectMapper(); + m2.setSerializerFactory(TypeBeanSerializerFactory.instance); + m2.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + + C de = m2.readValue(is, C.class); + assertEquals(c.map, de.map); + } }
