java - 使用 Jackson(多态)反序列化时缺少字段

标签 java jackson

我正在尝试为采用 JSON 输入的前端库创建一个 Java SDK。本质上,此 SDK 将特定类型的对象转换为 JSON,然后由该前端库使用。

我正在使用 jackson 的注释系统进行多态序列化/反序列化。

我有一个基类 A 和扩展 A 的 2 个子类 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。我不确定为什么 jackson 没有在对象上设置这些值。

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

最佳答案

您需要向@JsonTypeInfo 添加参数visible = true 以避免在反序列化时删除类型。

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

public abstract boolean visible() default false

Property that defines whether type identifier value will be passed as part of JSON stream to deserializer (true), or handled and removed by TypeDeserializer (false). Property has no effect on serialization. Default value is false, meaning that Jackson handles and removes the type identifier from JSON content that is passed to JsonDeserializer.

关于java - 使用 Jackson(多态)反序列化时缺少字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40079632/

相关文章:

java - if block 中的 if 条件未被检查

java - 并行流将项目添加到同一数组

json - 使用@JsonIdentityInfo 时的 Jackson "MismatchedInputException: No Object Id found for an instance"

java - Lombok 的 lombok.copyableAnnotations 不适用于 Jackson 注释

java - 是否可以在 spring-data-mongodb 中注入(inject)自定义 Jackson ObjectMapper?

java - 以下样本的正确 map 格式是什么?

java - @RequestBody 如何区分未发送的值和空值?

java - 通过路径获取Alfresco NodeRef

java - 错误 : Can't serialize value : Expected a 'String' or 'java.time.temporal.TemporalAccessor' but was 'Timestamp' .“在使用 Graphql 的 Spring Boot 中

Java CDI 依赖项无效 DependsOn