2011-11-16 3 views
0

flex.messaging.io.amf.ASObject을 JSON에 직렬화 및 비 직렬화하려고합니다. ASObject은 HashMap을 확장하고 추가 유형 속성을 추가합니다. 기본적으로 Jackson은 객체 아래의 모든 키와 값을 올바르게 serialize하지만 ASObject.getType()은 유지하지 않습니다.ASObject를 JSON으로 직렬화하는 방법

내가 ASObject에 대한 사용자 지정 serializer를 만들기 위해 관리했습니다 지금과 같은 직렬화하고 잭슨 사용 :

[{"@type":"org.me.MyClass","map":{"key":"value"}}] 

다음 추가 유형 필드를 추가 java.util.Map 다시 표준 핸들러에 위임하여이었다. 그러나 사용자 지정 deserialization을 허용하도록 Jackson을 구성 할 수 있는지 잘 모르겠습니다.

아마 내가 잘못 생각하고 있습니다!

답변

0

아마도 맞춤형 디시리얼라이저도 만들고 싶습니까? deserializing (속성에 ASOBject 유형 있음) 할 때 유형이 컨텍스트에서 알 수있는 한 해당 유형 필드가 실제로 필요하지 않을 수 있습니다.

0

하나의 방법이 있습니다.

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 
{ 
} 
관련 문제