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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 11:09:03