使用注释的 Jackson 多态反序列化

Jackson polymorphic deserialization using annotations

假设我们有以下类型:

interface Animal {}
class Dog implements Animal {...}
class Cat implements Animal {...}
class Zoo {
    private String animalType;
    private Animal animal;
    ...
}

鉴于 CatDog 具有不同的属性,我们如何根据始终存在于 json ?我知道如何使用 custom deserialization 来做到这一点,但我找不到使用 Jackson annotations 来做到这一点的方法。如果 animalType 属性 驻留在 CatDog 中,这是可能的,但在我的情况下,它的位置在 Zoo.

有什么想法吗?

您可以使用 JsonTypeInfo 注释 Zoo 中的 animal 字段,以根据 animalType 指定您想要 DogCat 的子类型] 字段也在 Zoo 中。棘手的一点是指定 Animal 的特定类型将来自 JSON 中 Animal 之外的 属性,即 EXTERNAL_PROPERTY

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "animalType")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Cat.class, name = "cat"),
        @JsonSubTypes.Type(value = Dog.class, name = "dog")
})
private Animal animal;