2012-12-27 76 views
4

JSON nest class data binding 的答案一样,当我序列化和反序列化,我得到这个异常的容器:序列化和反序列化与杰克逊异常

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not find a Value deserializer for abstract type [simple type, class com.xiaonei.wap.ps.model.Container] 
at org.codehaus.jackson.map.deser.StdDeserializerProvider._handleUnknownValueDeserializer(StdDeserializerProvider.java:321) 
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:116) 
at org.codehaus.jackson.map.deser.StdDeserializer.findDeserializer(StdDeserializer.java:260) 
at 

回答

0

只需删除或type场重命名的setter /吸气

public class Container 
{ 
    private AAnimal animal; 

    public AAnimal getAnimal() 
    { 
     return animal; 
    } 

    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.EXTERNAL_PROPERTY, property="type") 
    @JsonSubTypes({ @Type(value = Cat.class, name = "cat"), @Type(value = Dog.class, name = "dog") }) 
    public void setAnimal(AAnimal animal) 
    { 
     this.animal = animal; 
    } 
}  

public abstract class AAnimal 
{ 
    public String name; 
} 

test

String json = "{\"type\":\"cat\", \"animal\" : {\"name\":\"cat-mew\" }}"; 
    Container val = o.readValue(json, Container.class); 
    System.out.println(o.writeValueAsString(val)); 

输出是

{"animal":{"name":"cat-mew"},"type":"cat"} 
+0

你能解释为什么吗? –

+1

如果我删除类型字段,我得到这个:org.codehaus.jackson.map.exc.UnrecognizedPropertyException:无法识别的字段“类型”(类com.chat.jsonobject.Message),未标记为可忽略 – Felix