如何将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 
{ 
}