java - jackson 继承和反序列化

标签 java inheritance jackson deserialization polymorphism

我正在 Spring Web MVC/Spring Hateoas 之上编写 API,即使简单类层次结构的反序列化非常有效,我也无法使用 jackson 将 Json 输入反序列化为正确的类型。 这是我的类层次结构:

public class A {
    protected String fieldA;
}

public class B extends A {
    protected String fieldB;
}

public class C extends A {
    protected String fieldC;
}

在每个人都向我发送有关 SO 的许多其他类似问题之前,这里的主要区别在于 A 是具体的。换句话说,Jackson 必须通过使用 json 字段作为决胜局在 3 种实现之间进行选择。

基本上,我如何配置 Jackson 使其反序列化:

{
    "fieldA": "asdf"
} 

A 的一个实例,和

{
    "fieldA": "asdf",
    "fieldB": "asdf"
} 

到 B 的一个实例?

最佳答案

没有办法自动做到这一点:所有自动多态类型处理都依赖于某种类型鉴别器(类型属性,最常见)。已要求能够使用基于内容的启发式方法,但到目前为止,还没有人提出可行的计划(或贡献)来实现此类功能。

要处理它,您可能需要编写自定义 JsonDeserializer 并自行检测类型。可以使用ConvertingDeserializer,让Jackson先将JSON绑定(bind)到JsonNodejava.util.Map,然后自己解压.

关于java - jackson 继承和反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21605594/

相关文章:

java - 在 OpenFire 中刷新 VCard

java - 一个类如何继承 Object 类和另一个显式父类(super class)?

JavaScript:如何检测ES6类有自己的构造函数?

java - 具有嵌套参数类的 Jackson Json

java - 处理测试继承的Testng

java - Java 中的 getConstructor 抛出 NoSuchMethodException

java - 如何以编程方式从文件中的值实例化动态加载的类?

java - 如何在不调用子类的情况下调用方法

java - 如何让 Spring Boot API 返回 MySQL 日期值的 UTC 时间而不是 "2018-08-01T04:00:00Z"?

java - 在 Jackson 中反序列化 JSON,其中键是值