我认为最好用一个例子来解释。
我有一个要反序列化的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
类之外时,是否有一种方法可以帮助反序列化器确定列表中的类型? (该列表将只包含一种子类型)
答案 0 :(得分:0)
Jackson在JsonTypeInfo
集合的类型擦除方面苦苦挣扎(以下是Jackson Scala bug report)。但是,数组是强类型的,因此,如果可能,您可以改用数组。看来是最简单的方法。
或者,编写一个能够实例化正确类的智能JsonDeserializer
可以与@JsonDeserialize(contentUsing=...)
注释一起使用。在内部,反序列化程序仍然可以使用杰克逊的readValue
方法。因此,它实际上只是负责选择正确的类型。 answers of this question给出了从自定义反序列化器恢复为标准反序列化的示例。