【问题标题】:Java Polymorphic Json DeserializationJava多态Json反序列化
【发布时间】:2020-08-28 16:15:13
【问题描述】:

我在我的项目 (Spring Java) 中使用 jackson 作为序列化和反序列化的一部分。 在我有接口(合同)作为 POJO 中的字段的正常情况下, 然后我使用@JsonTypeInfo@JsonSubTypes 在多态情况下实现反序列化。 但是,现在,我有这样的场景:

public class classA {

    private contractA fieldA;
    
    //constructor and getter-setters.
}

那么,

public interface contractA {
}

最后,

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(/* concrete-class1 as name-value */),
        @JsonSubTypes.Type(/* concrete-class2 as name-value */),
})
public interface contractB extends contractA {
    //contract methods.
}

现在,当classA 作为控制器请求主体传递并且我将fieldA 作为concrete-class1concrete-class2 传递时, JsonSubTypes 没有被杰克逊用来反序列化到其中之一。 我这样做并有两个合同的原因是由于包依赖性。 contractBcontractA 的包装不同。 如何使用 jackson 在 contractA 上配置此类在其子类中指定的 JsonSubTypeInfo

或者,也欢迎任何其他库或方法。

谢谢!

【问题讨论】:

  • 尝试使用MixIn 功能在ContractA 接口上声明@JsonTypeInfo@JsonSubTypes 注释。见Jackson parse json with unwraping root, but without ability to set @JsonRootName
  • 我在这里写了类似的答案stackoverflow.com/a/63620373/3295987
  • @PratapiHemantPatel 我有classAcontractA 在不同的包中,比如package1。和 contractB 在不同的包中,比如 package2。并且,package2 具有 package1 的依赖关系。所以,我不能在package1 中引用package2 类。而concrete-class1(和concrete-class2)在package2。所以,我不能在contractA 上将它们称为@JsonSubTypes,但是我可以在contractB 上将它们称为,这就是原因。

标签: java json spring serialization jackson


【解决方案1】:

这个问题后来通过引入我们自己的客户JsonTypeInfo来解决。

当应用程序处于部署状态时,我们获取JsonTypeInfo 注释中存在的所有子类(类似于杰克逊的自定义注释)并维护一个数据结构,该结构将在serializingdeserializing 中使用。这个过程有点类似于Jackson 的过程(除了查找嵌套层次结构之外)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多