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

Jackson XmlMapper排除空数组空值及编码设置问题

JSON转XML:NON_EMPTY配置不生效及ISO-8859-1编码设置方案

一、解决JsonInclude.Include.NON_EMPTY不生效的问题

你当前的全局配置没起作用,通常是两个原因导致的,对应解决方法如下:

  1. 字段未配合注解强化规则
    XmlMapper的全局NON_EMPTY配置需要字段层面的匹配,如果你MyObject.Obj1及嵌套类中的数组/对象字段没明确标注序列化规则,默认行为可能会覆盖全局配置。直接在对应字段上添加注解:
public class Obj1 {
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<String> someArrayField;
    
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private NestedObject someObjectField;
    
    // getter、setter方法
}
  1. 补充XmlMapper特有的空值处理配置
    XmlMapper对空集合、null对象的逻辑和JSON序列化略有差异,需要额外关闭两个特性,确保空值不被输出:
// 禁止输出null的Map值
mapper.disable(SerializationFeature.WRITE_NULL_MAP_VALUES);
// 禁止将null值序列化为空XML元素
mapper.disable(ToXmlGenerator.Feature.WRITE_NULLS_AS_EMPTY_ELEMENTS);

二、设置XML编码为ISO-8859-1

直接用writeValueAsString无法指定编码(String本身是Unicode编码,转码发生在输出阶段),必须通过字节流指定编码,同时要确保XML声明中的编码和实际输出一致:

  1. 配置XML声明的编码
mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
// 手动指定XML声明里的编码版本和编码格式
mapper.getFactory().setXmlVersion("1.0");
mapper.getFactory().setXmlEncoding("ISO-8859-1");
  1. 通过字节流输出指定编码的XML
    替换原有的writeValueAsString代码:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 用OutputStreamWriter指定ISO-8859-1编码
try (OutputStreamWriter osw = new OutputStreamWriter(baos, StandardCharsets.ISO_8859_1)) {
    writer.writeValue(osw, jsonNode);
}
// 按指定编码转成字符串
String xmlString = baos.toString(StandardCharsets.ISO_8859_1.name());

完整修正代码

ObjectMapper objectMapper = new ObjectMapper();
com.main.models.MyObject.Obj1 targetObj = objectMapper.readValue(jsonStr, com.main.models.MyObject.Obj1.class);

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
// 全局序列化规则:空值不输出
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
// 补充XmlMapper空值处理配置
xmlMapper.disable(SerializationFeature.WRITE_NULL_MAP_VALUES);
xmlMapper.disable(ToXmlGenerator.Feature.WRITE_NULLS_AS_EMPTY_ELEMENTS);
// 设置XML声明及编码
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
xmlMapper.getFactory().setXmlVersion("1.0");
xmlMapper.getFactory().setXmlEncoding("ISO-8859-1");

ObjectWriter xmlWriter = xmlMapper.writer().withRootName("root");

// 生成ISO-8859-1编码的XML字符串
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (OutputStreamWriter osw = new OutputStreamWriter(baos, StandardCharsets.ISO_8859_1)) {
    xmlWriter.writeValue(osw, targetObj);
}
String xmlString = baos.toString(StandardCharsets.ISO_8859_1.name());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:07:40