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
相关产品推荐
相关产品推荐

