【发布时间】: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-class1 或concrete-class2 传递时,
JsonSubTypes 没有被杰克逊用来反序列化到其中之一。
我这样做并有两个合同的原因是由于包依赖性。 contractB
与contractA 的包装不同。
如何使用 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 我有
classA和contractA在不同的包中,比如package1。和contractB在不同的包中,比如package2。并且,package2具有package1的依赖关系。所以,我不能在package1中引用package2类。而concrete-class1(和concrete-class2)在package2。所以,我不能在contractA上将它们称为@JsonSubTypes,但是我可以在contractB上将它们称为,这就是原因。
标签: java json spring serialization jackson