如何配置序列化器使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的序列化逻辑做更多扩展,可以编写自定义序列化器:
- 实现序列化器类:
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()); } }
- 修改
SuperObject类,指定序列化器并设置字段名:
class SuperObject { @JsonProperty("superObjectId") @JsonSerialize(using = ObjectIdSerializer.class) ObjectId superObjectId; }
为什么@JsonUnwrapped的prefix方式不适用?
@JsonUnwrapped的核心作用是展开嵌套对象的字段,而非将整个嵌套对象映射为单一字段。使用prefix时,Jackson会直接将前缀与嵌套对象的字段名拼接(例如prefix="super" + objectId → superobjectId),不会自动处理驼峰命名转换,因此无法得到符合要求的superObjectId。
内容的提问来源于stack exchange,提问作者Haster
相关产品推荐
相关产品推荐

