gpt4 book ai didi

java - 使用 Jackson(多态)反序列化时缺少字段

转载 作者:搜寻专家 更新时间:2023-11-01 02:38:34 24 4
gpt4 key购买 nike

我正在尝试为采用 JSON 输入的前端库创建一个 Java SDK。本质上,此 SDK 将特定类型的对象转换为 JSON,然后由该前端库使用。

我正在使用 jackson 的注释系统进行多态序列化/反序列化。

我有一个基类 A 和扩展 A 的 2 个子类 B 和 C。A 类有一个类型字段,我使用它来决定要使用哪个类(B 或 C)。语法看起来像这样:

@JsonTypeInfo({
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property= "type"
})
@JsonSubTypes({
@JsonSubTypes.Type(value = B.class, name = "b"),
@JsonSubTypes.Type(value = C.class, name = "c")
})
public class A {
private String type;

public void setType(String type){
this.type = type;
}

public String getType(){
return this.type;
}
}

public class B extends A {

}

public class C extends A {

}

现在,当我使用 Jackson 的 ObjectMapperreadValue 函数并读取字符串化的 JSON 并转换为 A 类时,我得到了 A 类或B类基于类型变量的值。 但是,这是实际问题,当我尝试使用函数getType 时,我总是在那些对象中得到null。我不确定为什么 jackson 没有在对象上设置这些值。

String json = "{ type: 'b' }"; // example input json

ObjectMapper om = new ObjectMapper();
A a = om.readValue(json, A.class);
// a is actually an instance of class B

a.getType()// this is null

最佳答案

您需要向@JsonTypeInfo 添加参数visible = true 以避免在反序列化时删除类型。

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property= "type",
visible = true
)

public abstract boolean visible() default false

Property that defines whether type identifier value will be passed as part of JSON stream to deserializer (true), or handled and removed by TypeDeserializer (false). Property has no effect on serialization. Default value is false, meaning that Jackson handles and removes the type identifier from JSON content that is passed to JsonDeserializer.

关于java - 使用 Jackson(多态)反序列化时缺少字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40079632/

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