如何在API响应中忽略POJO的空值字段?——动态处理Sample类D字段的保留与忽略需求
动态忽略null字段的几种实现方案
这问题我之前做接口开发时也碰到过,静态的@JsonIgnore显然满足不了这种动态场景,得用基于字段值的序列化控制逻辑。下面分最常用的Jackson和Gson两种情况给你说解决方案:
一、如果用Jackson JSON库(Spring Boot默认用这个)
1. 最简方案:@JsonInclude注解
直接给Sample类或者单独给D字段加@JsonInclude(JsonInclude.Include.NON_NULL)注解,Jackson会自动忽略所有值为null的字段,完美匹配你的需求——D为null时不输出,有值时正常序列化。
给类加的写法:
static final class Sample { Enum A, B, C, D; @JsonInclude(JsonInclude.Include.NON_NULL) Sample(A, B, C) { // 初始化A、B、C,D留空 } }
单独给D字段加的写法(更精准,不影响其他字段):
static final class Sample { Enum A, B, C; @JsonInclude(JsonInclude.Include.NON_NULL) Enum D; Sample(A, B, C) { // 初始化A、B、C } }
2. 自定义序列化器(复杂场景用)
如果之后有更复杂的判断逻辑(比如除了null还要看其他业务条件),可以写个自定义序列化器完全控制输出:
public class SampleSerializer extends StdSerializer<Sample> { public SampleSerializer() { super(Sample.class); } @Override public void serialize(Sample sample, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartObject(); // 必输出的字段直接写 gen.writeObjectField("A", sample.A); gen.writeObjectField("B", sample.B); gen.writeObjectField("C", sample.C); // 只有D不为null时才写入JSON if (sample.D != null) { gen.writeObjectField("D", sample.D); } gen.writeEndObject(); } }
然后给Sample类加注解指定用这个序列化器:
@JsonSerialize(using = SampleSerializer.class) static final class Sample { // ... 字段和构造函数不变 }
3. 全局ObjectMapper配置(不修改实体类)
如果不想动实体类的注解,可以在配置Jackson的ObjectMapper时全局设置忽略null字段:
ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
这样所有用这个mapper序列化的对象,null字段都会被自动跳过。
二、如果用Gson库
Gson默认行为就是不序列化null字段!也就是说你啥都不用配置,直接把Sample实例丢给Gson序列化,D为null时不会出现在JSON里,有值时会自动包含,刚好符合你的需求。如果之前改过Gson的配置开启了serializeNulls(),记得把这个配置去掉就行。
内容的提问来源于stack exchange,提问作者N.Rajal
相关产品推荐
相关产品推荐

