Java中ObjectMapper空值处理及API返回保留空对象结构问题
解决ObjectMapper序列化时保留空数组的问题
我来帮你搞定这个Jackson序列化空数组被过滤的问题——这是个挺常见的场景,默认配置确实会把空集合(包括空数组)当成“空值”给过滤掉,所以才会出现你看到的links和embedded变成空对象的情况。下面给你几种可行的解决方案:
1. 全局配置ObjectMapper(适用于所有序列化场景)
如果你希望整个应用的序列化都保留空数组(只过滤null值),可以直接修改ObjectMapper的序列化包含规则:
ObjectMapper objectMapper = new ObjectMapper(); // 只排除null值,空集合/空数组会被保留 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
如果是Spring Boot项目,还可以通过配置文件全局生效,不用写代码:
application.properties
spring.jackson.serialization-inclusion=non_null
application.yml
spring: jackson: serialization: inclusion: non_null
2. 针对特定类/字段精准配置(更灵活)
如果不想全局修改规则,只想让特定的类或字段保留空数组,可以用@JsonInclude注解:
类级别配置(整个类的字段都遵循此规则)
@JsonInclude(JsonInclude.Include.NON_NULL) public class ApiResponse { private Links links; private Embedded embedded; // getter、setter方法 } // 对应的Links和Embedded类同样可以加注解 @JsonInclude(JsonInclude.Include.NON_NULL) public class Links { private List<String> products; private List<String> packages; // getter、setter方法 }
字段级别配置(仅指定字段保留空数组)
如果只想让某个特定字段保留空数组,其他字段依然过滤空值,可以直接在字段上加注解:
public class Links { @JsonInclude(JsonInclude.Include.ALWAYS) private List<String> products; @JsonInclude(JsonInclude.Include.ALWAYS) private List<String> packages; // getter、setter方法 }
3. 验证效果
配置完成后,再序列化你的响应对象,就能得到你期望的格式:
{"links": {"products": [], "packages": []}, "embedded":{"products": [], "packages": []}}
内容的提问来源于stack exchange,提问作者ammy
相关产品推荐
相关产品推荐

