我正在尝试为需要JSON输入的前端库创建一个java SDK。本质上,此SDK将特定类型的对象转换为JSON,然后由该前端库使用。
我正在使用杰克逊的多态序列化/反序列化使用其注释系统。
我有一个基类A和2个子类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 {
}
现在,当我使用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
答案 0 :(得分:4)
您需要将参数IF (grade='INC') THEN
SET equivalent_grade = grade;
ELSEIF (grade > 100) THEN
SET equivalent_grade = '1';
ELSEIF (grade < 69) THEN
SET equivalent_grade = '5';
ELSE
SET equivalent_grade = (SELECT equivalent_grade.`equivgrade` FROM equivalent_grade WHERE equivalent_grade.`fromgrade`<= grade AND equivalent_grade.`tograde`>= grade);
添加到@JsonTypeInfo
,以避免在反序列化时删除该类型。
visible = true
public abstract boolean visible()默认为false
定义类型标识符值是否将作为JSON流的一部分传递给反序列化程序(true)或处理的属性 由TypeDeserializer删除(false)。财产没有影响 序列化。默认值为false,表示Jackson处理 并从传递给的JSON内容中删除类型标识符 JsonDeserializer。