gpt4 book ai didi

java - Jackson 可以使用它没有编写的 boolean JSON 属性反序列化为具体子类吗?

转载 作者:行者123 更新时间:2023-11-30 05:19:46 27 4
gpt4 key购买 nike

我正在使用 Jackson 反序列化从其他地方收到的 JSON 文件 - 也就是说我可以控制反序列化,但不能控制序列化。

假设 JSON 描述了一个混合了水生和陆生动物的平面列表。

动物 JSON 属性之一是 boolean 值 isAquatic。在 Java 中,AquaticAnimalLandAnimal 是单独的类,它们都是抽象类 Animal 的子类,其中包含与动物的两种子类型相关的成员数据。动物没有其他子类,也永远不会有。水生动物具有诸如鳃之类的属性,这些属性对于 LandAnimal 来说毫无意义(因此 LandAnimal 在 JSON 中永远不会有这样的属性,并且子类提​​供了相关的行为)。同样,陆地动物也是如此,它们可能有爪子、肺等。(这不是一个完美的例子,但它达到了目的)

反序列化时,我想在执行以下操作时使用 isAquatic 的值来决定使用哪个子类:

Animal animal = mapper.readValue( ... , Animal.class);

处理多态性的所有示例都涉及在使用 Jackson 序列化 JSON 时将额外的数据写入 JSON,但我只是读取数据,因此我无法轻松做到这一点。但是,我可以根据 JSON 中已有的信息确定正确的类,因此我想这样做。

我不完全理解 Jackson 标签,但根据其他示例,我希望能够执行以下操作:

@JsonSubTypes({
@JsonSubTypes.Type(value = LandAnimal.class, isAquatic = false),

@JsonSubTypes.Type(value = AquaticAnimal.class, isAquatic = true) }
)
public abstract class Animal {
...

我确信这不是该注释的用途,但希望它能解释我想要做什么。

谁能告诉我 jackson 是否可以做到这一点,如果可以,怎么做?

最佳答案

通过一些漂亮方便的花花公子符号工作是可能的:

@JsonTypeInfo(  
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "isAquatic")
@JsonSubTypes({
@JsonSubTypes.Type(value = LandAnimal.class, name = "false"),
@JsonSubTypes.Type(value = AquaticAnimal.class, name = "true")
})
public abstract class Animal {
private String isAquatic;
...

这将获取属性 isAquatic 并将其映射到 json 类型字段 name,然后根据该名称返回正确的类;

注意:我只对字符串字段执行了这种方法,因此我将 isAquatic 设为字符串,您也许可以尝试其他方法来查看它是否适用于 boolean 值。

关于java - Jackson 可以使用它没有编写的 boolean JSON 属性反序列化为具体子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59755342/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com