我正在尝试为采用JSON输入的前端库创建Java SDK。本质上,此SDK将某些类型的对象转换为JSON,然后由该前端库使用。
我正在使用其注释系统使用杰克逊的多态序列化/反序列化。
我有一个基类A和两个子类B和C扩展了A。类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 {
}
Run Code Online (Sandbox Code Playgroud)
所以,现在,当我使用杰克逊ObjectMapper的readValue功能和读取字符串化JSON,并转换为A类,我得到一个基于类型变量的值是由A类或B类的正确实例。但是,这是实际的问题,当我尝试使用该函数时,getType我总是null在这些对象中得到。我不确定杰克逊为什么没有在对象上设置这些值。
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
Run Code Online (Sandbox Code Playgroud)
小智 6
您需要添加到@JsonTypeInfo参数中visible = true以避免在反序列化时删除类型。
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property= "type",
visible = true
)
Run Code Online (Sandbox Code Playgroud)
public abstract boolean visible() 默认 false
定义类型标识符值是作为 JSON 流的一部分传递给反序列化器 (true) 还是由 TypeDeserializer (false) 处理和删除的属性。属性对序列化没有影响。默认值为 false,这意味着 Jackson 处理并从传递给 JsonDeserializer 的 JSON 内容中删除类型标识符。