FasterXml Jackson序列化空列表时消除空元素的问题解决
解决Jackson XML序列化空列表生成空
<user>元素的问题 我之前也碰到过完全一样的坑,折腾了好一阵才理顺,给你几个实用的解决方案:
1. 调整字段注解(推荐)
只需要给users字段加两个关键注解,就能让空列表输出成干净的<users/>,而不是带空<user>的结构:
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; // ... @JacksonXmlElementWrapper(localName = "users") @JacksonXmlProperty(localName = "user") // 空列表/null时不生成<user>子元素 @JsonInclude(JsonInclude.Include.NON_EMPTY) // 初始化为空列表,避免出现null的情况 private List<User> users = new ArrayList<>();
注解作用说明:
@JsonInclude(JsonInclude.Include.NON_EMPTY):告诉Jackson只有当列表有内容时才序列化<user>子元素,空列表或null时只保留外层的<users>包装标签。- 初始化为
new ArrayList<>():从根源避免users为null的情况,这样JSON输出会变成{"users":[]}而不是null,XML则会输出<users/>。
2. 全局配置XmlMapper(适合多字段统一规则)
如果你的项目里有很多类似的列表字段,不想逐个加注解,可以全局配置XmlMapper,让所有空列表都遵循这个规则:
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.databind.SerializationFeature; // ... XmlMapper xmlMapper = new XmlMapper(); // 禁止输出空的XML子元素 xmlMapper.configure(SerializationFeature.WRITE_EMPTY_XML_ELEMENTS, false); // 全局统一:只序列化非空、非null的属性 xmlMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_EMPTY);
配置完成后,所有空列表都会被序列化为空的包装标签,不会生成多余的空子元素。
3. 处理null的特殊场景
如果业务逻辑中users可能被设置为null,又希望即使是null时也输出<users/>,可以在setter方法里做兜底处理:
public void setUsers(List<User> users) { // 传入null时自动转为空列表 this.users = users != null ? users : new ArrayList<>(); }
这样不管是传入null还是空列表,最终都会被处理成空列表,序列化结果都是<users/>。
最终效果测试:
当users是空列表时,XML输出:
<response> <users/> </response>当users有数据时,正常输出:
<response> <users> <user>...</user> <user>...</user> </users> </response>
内容的提问来源于stack exchange,提问作者Krish
相关产品推荐
相关产品推荐

