jackson-使用多态类型列表反序列化对象

时间:2018-11-13 02:43:56

标签: java json jackson

我认为最好用一个例子来解释。

我有一个要反序列化的JSON对象,其中包含类型接口的列表以及列表中的类型,但是我不确定如何获取反序列化器以确定列表中的具体类型:

要反序列化的类型

public class MyClass {
    private MyEnum type; // A or B
    private List<Parent> objects;
}

界面

public interface Parent

孩子

public ChildA implements Parent
public ChildB implements Parent


我知道如果不是 JsonSubTypes,我可以将List与该类型一起使用,例如:

@JsonTypeInfo(use = Id.NAME, include = As.EXISTING_PROPERTY, property = "type", visible = true)
@JsonSubTypes({
        @JsonSubTypes.Type(value = ChildA.class, name = "A"),
        @JsonSubTypes.Type(value = ChildB.class, name = "B")
})

如果type在Parent类型中,也是一样。但是,当类型在Parent类之外时,是否有一种方法可以帮助反序列化器确定列表中的类型? (该列表将只包含一种子类型)

1 个答案:

答案 0 :(得分:0)

Jackson在JsonTypeInfo集合的类型擦除方面苦苦挣扎(以下是Jackson Scala bug report)。但是,数组是强类型的,因此,如果可能,您可以改用数组。看来是最简单的方法。

或者,编写一个能够实例化正确类的智能JsonDeserializer可以与@JsonDeserialize(contentUsing=...)注释一起使用。在内部,反序列化程序仍然可以使用杰克逊的readValue方法。因此,它实际上只是负责选择正确的类型。 answers of this question给出了从自定义反序列化器恢复为标准反序列化的示例。

相关问题