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

如何移除使用@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类的序列化器:

  1. 编写自定义序列化器:
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();
        }
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:55:17