如何移除使用@JsonInclude(Include.NON_NULL)后出现的空对象?
解决方案
针对你遇到的全Null字段的User对象被序列化为{}的问题,提供以下几种可行方案:
方案1:替换@JsonInclude枚举值为NON_EMPTY
将原来的@JsonInclude(JsonInclude.Include.NON_NULL)替换为@JsonInclude(JsonInclude.Include.NON_EMPTY)。
NON_EMPTY规则不仅会排除null字段,还会将所有属性均为null的对象视为"空值",从而在序列化时直接移除该属性(或替换为null)。这样全Null的User对象就不会被序列化为{},而是直接从响应中消失。
代码示例:
@JsonInclude(JsonInclude.Include.NON_EMPTY) public class User { private Integer id; private String name; // getter、setter方法 }
注意:如果User类包含基础类型字段(如int、long,默认值为0),这类字段不会被视为null,此时全属性默认值的对象不会被NON_EMPTY排除,需要额外处理。
方案2:自定义序列化器
如果需要更灵活的判断逻辑(比如某些字段允许为默认值但仍要判定对象为空),可以自定义User类的序列化器:
- 编写自定义序列化器:
public class UserSerializer extends JsonSerializer<User> { @Override public void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (user == null) { gen.writeNull(); return; } // 自定义判断逻辑:这里判断id和name是否都为null boolean isAllNull = user.getId() == null && user.getName() == null; if (isAllNull) { gen.writeNull(); } else { // 正常序列化非空字段 gen.writeStartObject(); if (user.getId() != null) { gen.writeNumberField("id", user.getId()); } if (user.getName() != null) { gen.writeStringField("name", user.getName()); } gen.writeEndObject(); } } }
- 在User类上指定使用该序列化器:
@JsonSerialize(using = UserSerializer.class) public class User { private Integer id; private String name; // getter、setter方法 }
这种方式可以完全控制对象是否被序列化为null,适合复杂的业务判断场景。
方案3:全局配置Jackson(Spring Boot项目)
如果希望整个项目都生效该规则,无需逐个类添加注解,可以通过全局配置Jackson的默认序列化规则:
方式1:配置文件(application.yml)
spring: jackson: default-property-inclusion: non_empty
方式2:Java配置类
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { return new ObjectMapper() .setDefaultPropertyInclusion(JsonInclude.Include.NON_EMPTY); } }
全局配置后,所有类的全Null对象都会被视为空值,序列化时自动移除或替换为null。
内容的提问来源于stack exchange,提问作者Saravana Kumar. V
相关产品推荐
相关产品推荐

