使用Jackson进行序列化和反序列化时出现异常

5
JSON嵌套类数据绑定,正如答案中所述。但是,当我序列化和反序列化容器时,我遇到了以下异常:
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
2个回答

0

如您提供的链接答案中所述,由于类型不属于父类,因此需要显式地将对象的type作为外部属性进行声明。这个JsonTypeInfo.As.EXTERNAL_PROPERTY将类型属性添加到上层结构。

因此,在转换后的代码中,这个type作为外部属性应该存在。所以,当您从json中删除那个type时,它就没有明确的默认实现了。这就是为什么您需要在注释中的defaultImpl参数中添加一个默认实现类的原因。

因此,要解决这个问题,您可以将AAnimal.class作为defaultImpl添加:

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

现在如果你从输入的 JSON 中省略 type,并进行测试:
String json = "{\"animal\" : {\"name\":\"cat-mew\" }}";

您将获得:

{"animal":{"name":"cat-mew"},"type":"AAnimal"}

0

只需删除或重命名type字段的setter/getter即可。

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;
}  

测试

  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"}

1
如果我移除type字段,会得到以下错误:org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "type" (Class com.chat.jsonobject.Message),未标记为可忽略的。 - Felix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接