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

Jackson序列化JSON时如何忽略值为空对象{}的字段

问题根因

@JsonInclude(JsonInclude.Include.NON_NULL)的生效规则是仅当字段本身值为null时才跳过序列化。你的代码里inner字段已经被赋值为new Item.Inner()实例,本身不是null,只是实例内部的name字段为null,所以序列化时只会去掉Inner类里为null的name字段,最终得到"inner": {}的结果,不会忽略整个inner键值对。

解决方案

选择以下任意一种方案即可实现需求:

  • 方案1:单字段配置(改动最小)
    给Item类的inner字段添加@JsonInclude(JsonInclude.Include.NON_EMPTY)注解,该规则会在字段值为null、空对象、空集合、空字符串时自动忽略该字段。修改后的Item类代码如下:

    @Data
    public class Item {
        private int id;
        // 核心是给inner字段加NON_EMPTY规则
        @JsonInclude(JsonInclude.Include.NON_EMPTY)
        private Inner inner;
    
        @Data
        public static class Inner {
            private String name;
        }
    }
    

    原来加在Inner类上的@JsonInclude(JsonInclude.Include.NON_NULL)可以保留,也可以删除,不影响最终效果。

  • 方案2:全局配置(适合项目统一规范)
    如果需要项目中所有空对象、空值字段都默认忽略序列化,不需要逐字段加注解,可以直接修改Spring Boot的Jackson全局配置。
    用yml配置的方式:

    spring:
      jackson:
        default-property-inclusion: non_empty
    

    用Java配置类的方式:

    @Configuration
    public class JacksonConfig {
        @Bean
        public ObjectMapper objectMapper() {
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
            return objectMapper;
        }
    }
    

配置完成后,接口返回结果就会变成预期的{"id": 123},空的inner对象会被完全忽略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:48:29