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

标签 java json jackson

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

我有一个想要反序列化的 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/

相关文章:

java - 有没有办法在 codenameone 中截取屏幕截图(尤其是对于 Android)?

嵌套对象中的 JSON 架构 v4 "required"

python - 将请求中的 JSON 数据转换为 Pandas DataFrame

java - 如何将 JsonIgnoreProperties 与父类(super class)合并?

json - org.codehaus.jackson.map.JsonMappingException : Can not instantiate value of type [simple type, 类 models.Job] 来自 JSON 字符串

java - 将 JSON 对象名称-值对反序列化为数组的元素

java - 绘制形状时,形状属性未在类之间正确传递 - Java Swing

java - 如何创建一种方法来计算从 4+ 方法中获取变量来进行计算?

java - Swing 应用程序框架 @Action 注释?做什么的?

Python: Can dumpdata cannot loaddata back. Unicode解码错误