You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用多态实现JSON序列化与反序列化异常问题求解

问题原因与修复方案

1. 反序列化失败问题

核心原因1:缺少多态类型匹配配置

Jackson实现多态反序列化必须依赖@JsonTypeInfo注解指定类型匹配规则,你的抽象类ParentTypeValue仅配置了@JsonSubTypes,未指定类型标识的读取规则,且你的类型标识字段type和value字段同级存放在ParentType中,不属于value内部字段,需要补充对应配置:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes({
    // 此处name值需要和JSON中type字段的实际值对应
    @JsonSubTypes.Type(value = CurrencyMapValue.class, name = "type1"),
    @JsonSubTypes.Type(value = IntegerValue.class, name = "type2")
})
public abstract class ParentTypeValue {
}

核心原因2:代码笔误

  • CurrencyMapValue当前继承的是LimitTypeValue,需要改为继承ParentTypeValue
  • @JsonSubTypes中配置的子类StringValue和实际实现的IntegerValue类名不匹配,需要修正一致
  • 子类@JsonTypeName注解的值需要和@JsonSubTypes中配置的name值保持一致

2. 序列化嵌套多余value层问题

你的IntegerValue、CurrencyMapValue子类内部都定义了名为value的属性,序列化时Jackson会先输出ParentType的value字段,再输出子类对象本身的value属性,形成两层嵌套。
修复方法:在两个子类的getValue方法上添加@JsonValue注解,该注解会让Jackson直接将方法返回值作为整个子类对象的序列化结果,不会包裹额外的对象层:

// IntegerValue示例
@JsonTypeName("type2")
public class IntegerValue extends ParentTypeValue {
  private int value;

  // 其余代码保持不变
  @JsonValue
  public int getValue() {
    return value;
  }
}

// CurrencyMapValue示例
@JsonTypeName("type1")
public class CurrencyMapValue extends ParentTypeValue {
  private Map<Currency, Double> value;

  // 其余代码保持不变
  @JsonValue
  public Map<Currency, Double> getValue() {
    return value;
  }
}

可选优化

如果使用Builder模式反序列化时出现属性匹配失败,可给所有Builder类添加@JsonPOJOBuilder注解明确字段匹配规则:

@JsonPOJOBuilder(withPrefix = "with")
public static class Builder {
  // Builder原有逻辑不变
}

内容的提问来源于stack exchange,提问作者Luismi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:09:03