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

时间:2017-06-19 15:51:18

标签: java jackson deserialization jackson2 jackson-databind

假设我们有以下类型:

RecurringJob.AddOrUpdate(() => SoccerDataFetcher_UpdatePlayersOfTeams(), Cron.Daily);

interface Animal {} class Dog implements Animal {...} class Cat implements Animal {...} class Zoo { private String animalType; private Animal animal; ... } Cat具有不同的属性,我们如何根据json中始终存在的Dog字符串将Zoo对象反序列化为适当的Animal子类型?我知道如何使用animalType执行此操作,但我无法使用custom deserialization找到相同的方法。如果Jackson annotations属性位于animalTypeCat,但在我的情况下,其位置位于Dog,则可以执行此操作。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用animalZoo中的JsonTypeInfo字段添加注释,以便根据Dog字段指定您想要的CatanimalType个子类型也在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;