Jackson XmlMapper排除空数组空值及编码设置问题
JSON转XML:NON_EMPTY配置不生效及ISO-8859-1编码设置方案
一、解决JsonInclude.Include.NON_EMPTY不生效的问题
你当前的全局配置没起作用,通常是两个原因导致的,对应解决方法如下:
- 字段未配合注解强化规则
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方法 }
- 补充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声明中的编码和实际输出一致:
- 配置XML声明的编码
mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true); // 手动指定XML声明里的编码版本和编码格式 mapper.getFactory().setXmlVersion("1.0"); mapper.getFactory().setXmlEncoding("ISO-8859-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
相关产品推荐
相关产品推荐

