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

如何用Jackson从MyMainObject的子对象中仅获取someId字段

Jackson序列化仅保留关联对象指定字段的解决方案

你的类结构如下:

public class MyMainObject {
    private Long id;
    private String myName;
    private SomeObject someObject;
    // 省略getter/setter
}

public class SomeObject {
    private Long someId;
    private String someName;
    // 省略getter/setter
}

要在不修改SomeObject、不新增DTO的前提下,让MyMainObject序列化时仅输出someObject的someId字段,最直接的方式是给MyMainObject的someObject字段添加@JsonSerialize注解,配合自定义序列化器实现:

步骤1:给目标字段添加注解

修改MyMainObject的someObject字段,指定自定义序列化器:

public class MyMainObject {
    private Long id;
    private String myName;
    @JsonSerialize(using = SomeObjectIdSerializer.class)
    private SomeObject someObject;
    // getter/setter 保持不变
}

步骤2:实现自定义序列化器

创建仅序列化someId字段的序列化器:

public class SomeObjectIdSerializer extends StdSerializer<SomeObject> {

    public SomeObjectIdSerializer() {
        super(SomeObject.class);
    }

    @Override
    public void serialize(SomeObject someObj, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeNumberField("someId", someObj.getSomeId());
        gen.writeEndObject();
    }
}

完成后,序列化MyMainObject得到的JSON结构会是:

{
  "id": 1,
  "myName": "test",
  "someObject": {
    "someId": 123
  }
}

如果希望someObject直接输出someId的数值(而非嵌套对象),可以修改序列化器逻辑,去掉对象包裹:

@Override
public void serialize(SomeObject someObj, JsonGenerator gen, SerializerProvider provider) throws IOException {
    gen.writeNumber(someObj.getSomeId());
}

此时JSON中someObject字段的值会直接是数字(如123),而非嵌套对象。

这种方式的优势是仅对MyMainObject中的someObject字段生效,不会影响其他场景下SomeObject的序列化行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:42:17