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

