我认为最好用一个例子来解释。
我有一个想要反序列化的 JSON 对象,其中包含类型接口(interface)列表以及列表中的类型,但我不确定如何让反序列化器确定列表中的具体类型:
键入要反序列化的内容
public class MyClass {
private MyEnum type; // A or B
private List<Parent> objects;
}
界面
public interface Parent
child
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
类之外时,有没有办法帮助反序列化器确定列表中的类型呢? (该列表将只包含一种子类型)
最佳答案
Jackson 在使用 JsonTypeInfo
进行集合类型删除方面遇到了困难(这是 Jackson Scala bug report )。但是,数组是强类型的,因此如果可能的话,您可以改用数组。这似乎是最简单的方法。
或者,写一个聪明的JsonDeserializer
能够实例化正确的类可以与 @JsonDeserialize(contentUsing=...)
一起使用注解。在内部,反序列化器仍然可以回退到使用 Jackson 的 readValue 方法。所以它实际上只负责选择正确的类型。这个answers of this question给出从自定义反序列化器恢复到标准反序列化的示例。
关于java - Jackson - 使用多态类型列表反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53273028/