Jackson JSON库:如何实例化包含抽象字段的类

我想将JSON字符串转换为java对象,但此对象的类包含抽象字段,Jackson无法实例化,也不会生成对象。 告诉它关于抽象类的一些默认实现的最简单方法是什么,比如

setDefault(AbstractAnimal.class, Cat.class); 

或者根据JSON属性名称来决定实现类,例如。 对于JSON对象:

 { ... cat: {...} ... } 

我愿意:

 setImpl("cat", Cat.class); 

我知道Jackson可以在JSON中嵌入类信息,但我不想让我使用的JSON格式复杂化。 我想通过设置默认实现类或属性名称(’cat’)来决定使用哪个类 – 就像在XStream库中一样,您可以在其中编写:

 xStream.alias("cat", Cat.class); 

有没有办法这样做,特别是在一行中,还是需要更多的代码?

有多种方式; 在1.8版本之前,最简单的方法可能是:

 @JsonDeserialize(as=Cat.class) public abstract class AbstractAnimal { ... } 

至于基于属性的决定,最好使用@JsonTypeInfo@JsonTypeInfo ,它自动嵌入(写入时)和使用类型信息。

有多种类型的信息(类名,逻辑类型名称),以及包含机制(as-included-property,as-wrapper-array,as-wrapper-object)。 这个页面: https : //github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization解释了一些概念。

这里有一个非常明确的例子的完整答案: https : //stackoverflow.com/a/30386694/584947

jackson将此称为多态反序列化。

它确实帮助了我解决了我的问题。 我有一个抽象类,我在数据库中保存,需要将其解组为一个类的具体实例(可以理解)。

它将向您展示如何正确地注释父抽象类以及如何教授jackson如何在解组时在运行时选择可用的子类候选者。

问题可以通过注释解决@JsonDeserialize在抽象类上引用Jacksonexception问题和解决方案https://www.baeldung.com/jackson-exception