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

如何配置序列化器使SuperObject序列化后输出superObjectId字段?

问题解决:调整Jackson序列化输出为指定驼峰字段名

问题回顾

当前代码场景:

  • ObjectId类单独序列化时输出{"objectId":1}
  • SuperObject类使用@JsonUnwrapped注解superObjectId字段后,序列化结果为{"objectId":1},但需求是{"superObjectId":1}
  • 尝试@JsonUnwrapped的prefix属性后,得到的是superobjectId,不符合驼峰命名要求

可行解决方案

方案1:添加自定义Getter方法(最简洁)

移除SuperObject中的@JsonUnwrapped注解,新增一个直接返回superObjectId对应数值的Getter方法,通过@JsonProperty指定目标字段名:

class SuperObject {
    ObjectId superObjectId;

    @JsonProperty("superObjectId")
    public long getSuperObjectIdValue() {
        return superObjectId.getObjectId();
    }

    // 若需要反序列化,保留原字段的setter方法
    public void setSuperObjectId(ObjectId superObjectId) {
        this.superObjectId = superObjectId;
    }
}

处理后效果:

  • 单独序列化ObjectId实例时,依然输出{"objectId":1}
  • 序列化SuperObject实例时,输出需求格式{"superObjectId":1}

方案2:自定义序列化器(适合复杂定制场景)

如果需要对ObjectId的序列化逻辑做更多扩展,可以编写自定义序列化器:

  1. 实现序列化器类:
public class ObjectIdSerializer extends StdSerializer<ObjectId> {
    public ObjectIdSerializer() {
        this(null);
    }

    public ObjectIdSerializer(Class<ObjectId> t) {
        super(t);
    }

    @Override
    public void serialize(ObjectId value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeNumber(value.getObjectId());
    }
}
  1. 修改SuperObject类,指定序列化器并设置字段名:
class SuperObject {
    @JsonProperty("superObjectId")
    @JsonSerialize(using = ObjectIdSerializer.class)
    ObjectId superObjectId;
}

为什么@JsonUnwrapped的prefix方式不适用?

@JsonUnwrapped的核心作用是展开嵌套对象的字段,而非将整个嵌套对象映射为单一字段。使用prefix时,Jackson会直接将前缀与嵌套对象的字段名拼接(例如prefix="super" + objectId → superobjectId),不会自动处理驼峰命名转换,因此无法得到符合要求的superObjectId。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:57:17