如何用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
相关产品推荐
相关产品推荐

