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

2022-09-01 00:03:55

我想将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

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

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

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

有多种类型信息(类名、逻辑类型名)以及包含机制(作为包含属性、作为包装器数组、作为包装器对象)。本页:https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization 解释了一些概念。


答案 2

一个完整的答案和一个非常明确的例子可以在这里找到:https://stackoverflow.com/a/30386694/584947

杰克逊将此称为多态反序列化。

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

它将向您展示如何正确注释父抽象类,以及如何教 Jackson 如何在取消marshaling时在运行时从可用的子类候选项中进行选择。