如何将ASObject序列化为JSON
问题描述:
我试图序列化并将flex.messaging.io.amf.ASObject
反序列化为JSON。 ASObject
扩展了HashMap并添加了一个额外的类型属性。默认情况下,Jackson正确序列化对象下的所有键和值,但不保留ASObject.getType()
。如何将ASObject序列化为JSON
使用杰克逊我已经成功地创建了ASObject
自定义序列化,我现在的序列化:
[{"@type":"org.me.MyClass","map":{"key":"value"}}]
这是通过添加额外的类型字段,然后委托回标准处理程序java.util.Map
。然而,我不知道我如何配置杰克逊允许自定义反序列化来允许自定义处理。
也许我会以错误的方式回答这个问题!
答
也许你想创建自定义的解串器?只要在反序列化时属性已知(属性具有ASOBject类型),就可能不需要该类型字段。
答
以下是一种方法。
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.module.SimpleModule;
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
ASObject asObject = new ASObject();
asObject.type = Bar.class;
asObject.put("1", "alpha");
asObject.put("TWO", "beta");
SimpleModule module = new SimpleModule("SimpleModule", Version.unknownVersion());
module.addSerializer(ASObject.class, new ASObjectSerializer());
ObjectMapper mapper = new ObjectMapper().withModule(module).setVisibility(JsonMethod.FIELD, Visibility.ANY);
String asObjectJson = mapper.writeValueAsString(asObject);
System.out.println(asObjectJson);
// output: {"type":"com.stackoverflow.q8158528.Bar","map":{"1":"alpha","TWO":"beta"}}
module = new SimpleModule("SimpleModule", Version.unknownVersion());
module.addDeserializer(ASObject.class, new ASObjectDeserializer());
mapper = new ObjectMapper().withModule(module).setVisibility(JsonMethod.FIELD, Visibility.ANY);
ASObject asObjectCopy = mapper.readValue(asObjectJson, ASObject.class);
System.out.println(asObjectCopy.equals(asObject));
// output: true
}
}
class ASObjectDeserializer extends JsonDeserializer<ASObject>
{
@Override
public ASObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
{
ASObject asObject = new ASObject();
JsonNode tree = jp.readValueAsTree();
try
{
asObject.type = Class.forName(tree.get("type").asText());
}
catch (ClassNotFoundException e)
{
System.exit(42);
}
asObject.putAll(jp.getCodec().treeToValue(tree.get("map"), Map.class));
return asObject;
}
}
class ASObjectSerializer extends JsonSerializer<ASObject>
{
@Override
public void serialize(ASObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
JsonProcessingException
{
jgen.writeStartObject();
jgen.writeStringField("type", value.type.getName());
jgen.writeObjectField("map", new HashMap(value));
jgen.writeEndObject();
}
}
class ASObject extends HashMap
{
Class type;
@Override
public boolean equals(Object o)
{
ASObject a = (ASObject) o;
return type.equals(a.type) && super.equals(a);
}
}
class Bar
{
}