我现在一直在使用杰克逊,而且有一件事困扰着我。也许我做错了。我们假设我们有以下类:
@JsonSerialize(as = AbstractAnimal.class) // these two lines...
@JsonDeserialize(as = AbstractAnimal.class) // ...are not doing what I want
public interface Animal { /* ... */ }
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({
@Type(value = Dog.class, name = "dog"),
@Type(value = Cat.class, name = "cat")
})
public abstract class AbstractAnimal implements Animal { /* ... */ }
public class Dog extends AbstractAnimal { /* ... */ }
public class Cat extends AbstractAnimal { /* ... */ }
所以有一个接口,并附有一个抽象基类。抽象基类列出JsonSubTypes
。
AbstractAnimal.class
,那么它可以工作。 Animal.class
的JSON字符串会使不工作。反序列化Animal.class
不起作用的原因是@JsonSerialize(as = AbstractAnimal.class)
尝试将Animal
真正反序列化为抽象基类,这当然会失败。我真正想要做的是将杰克逊的类型推理机制重定向到递归检查AbstractAnimal
上的注释,而不是直接使用AbstractAnimal
。
杰克逊如何正确地完成这项工作?