如何序列化包含空对象集合的POJO字段?
哈哈,这个坑我之前踩过!Jackson默认会把空集合给“藏起来”,尤其是它默认的序列化规则会排除空的容器类(比如空Set、空List),所以你初始化的空HashSet就没被序列化出来。给你两个实用的解决办法:
方法一:给实体类加局部注解(精准控制单个类)
直接在Target类上加上@JsonInclude注解,指定要包含所有字段,哪怕是空的:
@JsonInclude(JsonInclude.Include.ALWAYS) public class Target { @JsonProperty(value="sizes",required=true) private Set<Size> Sizes; @JsonProperty(value="domains",required=true) private Set<String> Domains; // 你的构造器、getters和setters }
这个注解会强制Jackson把所有字段都序列化到JSON里,不管它的值是空集合还是空字符串,完美匹配你要的输出。
方法二:全局配置ObjectMapper(所有序列化生效)
如果你不想每个实体类都加注解,可以全局配置ObjectMapper,修改它的序列化包含规则:
ObjectMapper objectMapper = new ObjectMapper(); // 配置为:只要字段不是null就序列化,空集合不属于null,所以会被保留 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 如果你连null字段也想序列化,就用ALWAYS: // objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
另外要注意,如果之前你给ObjectMapper加过objectMapper.disable(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS)这个配置,一定要把它去掉——这个配置会专门阻止空数组的输出,刚好和你的需求相反。
试一下上面的任意一种方法,序列化出来的结果就是你想要的{"sizes":[], "domains":[]}啦!
内容的提问来源于stack exchange,提问作者Stan Marsh




