使用Jackson(Polymorphic)进行反序列化时缺少字段

时间:2016-10-17 06:18:22

标签: java jackson

我正在尝试为需要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

1 个答案:

答案 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。