Jackson JSON SubTypes反序列化异常:预期START_ARRAY却收到START_OBJECT
错误根因
问题出在Jackson多态序列化的配置规则和实际JSON结构不匹配:
你将带@JsonTypeInfo的自定义注解标注在了List<BaseConditionField> condition字段上,且设置了include = JsonTypeInfo.As.EXTERNAL_PROPERTY,该配置的含义是类型标识字段type需要和condition字段同级,作为它的外部属性存在,但你的JSON结构里type字段是放在每个BaseConditionField子类实例内部的,完全不匹配配置规则,Jackson找不到类型标识就触发了默认的WRAPPER_ARRAY预期,才会抛出「期望数组、实际拿到对象」的报错。
修复步骤
1. 把多态配置移到抽象父类上
直接在BaseConditionField类上添加多态注解,所有子类实例会自动应用该规则,不需要在每个引用字段上单独加注解:
@Data @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, // 标识字段放在类实例内部 property = "type" ) @JsonSubTypes( { @JsonSubTypes.Type(value = ProjectConditionField.class, name = "project.field"), @JsonSubTypes.Type(value = EvaluateConditionField.class, name = "evaluate.nested") } ) public abstract class BaseConditionField implements Serializable { // 原有代码全部保留不变 }
2. 清理冗余配置
删除ConditionType枚举内部自定义的@TypeInfo注解(或者删掉注解里的@JsonTypeInfo、@JsonSubTypes配置),同时删除EvaluateConditionField类的condition字段上的@ConditionType.TypeInfo注解:
@Data public class EvaluateConditionField extends BaseConditionField { private List<BaseConditionField> condition; @Override protected Set<ConditionOperator> getSupportedOperators() { return of(ConditionOperator.AND, ConditionOperator.OR); } }
修改完成后不需要调整现有JSON结构,即可正常完成递归嵌套的反序列化,也兼容你现有的字段校验逻辑。
内容的提问来源于stack exchange,提问作者Shaurya Chaudhuri
相关产品推荐
相关产品推荐

