使用注释的 Jackson 多态反序列化
Jackson polymorphic deserialization using annotations
假设我们有以下类型:
interface Animal {}
class Dog implements Animal {...}
class Cat implements Animal {...}
class Zoo {
private String animalType;
private Animal animal;
...
}
鉴于 Cat
和 Dog
具有不同的属性,我们如何根据始终存在于 json ?我知道如何使用 custom deserialization
来做到这一点,但我找不到使用 Jackson annotations
来做到这一点的方法。如果 animalType
属性 驻留在 Cat
或 Dog
中,这是可能的,但在我的情况下,它的位置在 Zoo
.
中
有什么想法吗?
您可以使用 JsonTypeInfo
注释 Zoo
中的 animal
字段,以根据 animalType
指定您想要 Dog
或 Cat
的子类型] 字段也在 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;
假设我们有以下类型:
interface Animal {}
class Dog implements Animal {...}
class Cat implements Animal {...}
class Zoo {
private String animalType;
private Animal animal;
...
}
鉴于 Cat
和 Dog
具有不同的属性,我们如何根据始终存在于 json ?我知道如何使用 custom deserialization
来做到这一点,但我找不到使用 Jackson annotations
来做到这一点的方法。如果 animalType
属性 驻留在 Cat
或 Dog
中,这是可能的,但在我的情况下,它的位置在 Zoo
.
有什么想法吗?
您可以使用 JsonTypeInfo
注释 Zoo
中的 animal
字段,以根据 animalType
指定您想要 Dog
或 Cat
的子类型] 字段也在 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;