杰克逊:如何使用抽象基类反序列化接口?

时间:2018-01-15 09:28:47

标签: java json jackson

我现在一直在使用杰克逊,而且有一件事困扰着我。也许我做错了。我们假设我们有以下类:

@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

  • 如果我尝试反序列化JSON字符串并要求AbstractAnimal.class,那么它可以工作。
  • 但是,反序列化类型为Animal.class的JSON字符串会使工作。

反序列化Animal.class不起作用的原因是@JsonSerialize(as = AbstractAnimal.class)尝试将Animal真正反序列化为抽象基类,这当然会失败。我真正想要做的是将杰克逊的类型推理机制重定向到递归检查AbstractAnimal上的注释,而不是直接使用AbstractAnimal

杰克逊如何正确地完成这项工作?

0 个答案:

没有答案