【问题标题】:Jackson polymorphic deserialization using annotations使用注释的杰克逊多态反序列化
【发布时间】:2017-06-19 15:51:17
【问题描述】:

假设我们有以下类型:

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

既然CatDog 具有不同的属性,我们如何根据始终存在于json 中的animalType 字符串将Zoo 对象反序列化为适当的Animal 子类型?我知道如何使用custom deserialization 做到这一点,但我找不到使用Jackson annotations 的方法。如果animalType 属性位于CatDog 中,这是可能的,但在我的情况下,它的位置在Zoo

有什么想法吗?

【问题讨论】:

    标签: java jackson deserialization jackson2 jackson-databind


    【解决方案1】:

    您可以使用JsonTypeInfo 注释Zoo 中的animal 字段,以根据animalType 字段以及Zoo 指定您想要DogCat 的子类型。棘手的一点是指定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;
    

    【讨论】:

    • 谢谢,JsonTypeInfo.As.EXTERNAL_PROPERTY 正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多