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

Spring Boot 3.1.2中Jackson序列化type字段重复问题求助

解决Jackson多态序列化时字段重复问题

问题根源

你遇到的重复字段问题,是因为@JsonTypeInfo默认会自动生成一个类型标识字段,而你在抽象类中又手动定义了同名(或改名后仍与Jackson自动生成逻辑冲突)的字段,导致Jackson同时序列化自动生成的类型标识和你手动定义的未赋值字段(所以出现一个有效值、一个null值)。

解决方案

调整@JsonTypeInfo的配置,让Jackson复用你手动定义的type字段作为类型标识,而不是额外生成新字段。核心是设置include = JsonTypeInfo.As.EXISTING_PROPERTY,并指定property为你自己的字段名。

代码示例

抽象类AbstractAccount修改

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.EXISTING_PROPERTY, // 复用已存在的字段
    property = "type" // 指定使用自定义的type字段
)
@JsonSubTypes({
    @JsonSubTypes.Type(value = DefaultAccount.class, name = "default")
})
public abstract class AbstractAccount {
    private String type;

    // Getter & Setter
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

子类DefaultAccount调整

public class DefaultAccount extends AbstractAccount {
    // 其他业务属性

    // 构造时同步设置type值,与@JsonSubTypes中定义的name一致
    public DefaultAccount() {
        setType("default");
    }
}

原理说明

  • As.EXISTING_PROPERTY告诉Jackson:不要新增类型标识字段,而是使用类中已存在的指定字段来存储类型信息。
  • 子类构造时设置的type值与@JsonSubTypes中定义的name保持一致,既能保证序列化后字段值正确,也能正常支持反序列化(Jackson会根据该字段值匹配对应的子类)。

如果之前你把字段改名为type2,只需将@JsonTypeInfo的property参数改为"type2",同时同步抽象类的字段名和子类的赋值逻辑即可,原理完全相同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:17:10