【发布时间】:2016-10-17 06:18:22
【问题描述】:
我正在尝试为接受 JSON 输入的前端库创建一个 java SDK。本质上,此 SDK 将特定类型的对象转换为 JSON,然后由该前端库使用。
我正在使用杰克逊的注释系统的多态序列化/反序列化。
我有一个基类 A 和 2 个扩展 A 的子类 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 的 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
【问题讨论】: