【问题标题】:Missing field when deserializing using Jackson (Polymorphic)使用 Jackson(多态)反序列化时缺少字段
【发布时间】: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 的 ObjectMapperreadValue 函数并读取字符串化的 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

【问题讨论】:

    标签: java jackson


    【解决方案1】:

    需要在@JsonTypeInfo中添加参数visible = true,避免反序列化时去掉类型。

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

    public abstract boolean visible() default false

    定义类型标识符值是否将作为 JSON 流的一部分传递给反序列化器 (true) 或处理和处理的属性 由 TypeDeserializer (false) 删除。属性没有影响 序列化。默认值为false,表示Jackson处理 并从传递给的 JSON 内容中删除类型标识符 JsonDeserializer。

    【讨论】:

    • 谢谢,工作!不知道我是如何在文档中错过它的。
    • 非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2018-07-21
    • 2017-09-08
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多