Jackson-dataformat-xml是什么 如何用它在Java中处理XML与JSON转换

9次阅读

Jackson-dataformat-xml 是 Jackson 官方提供的 XML 数据处理扩展模块,用于实现 java 对象与 XML 的序列化/反序列化,需配合 jackson-databind 使用,不支持 jsON 与 XML 字符串直接互转。

Jackson-dataformat-xml是什么 如何用它在Java中处理XML与JSON转换

Jackson-dataformat-xml 是什么

它是一个 Jackson 官方提供的扩展模块,用于在 Java 中读写 XML 数据,和 jackson-databind 配合使用,让 ObjectMapper 支持 XML 序列化/反序列化。它不处理 json —— JSON 是 jackson-databind 本体的能力;XML 支持是靠这个插件“加装”的。

关键点:它不是独立的 JSON↔XML 转换器,不能直接把一段 JSON 字符串转成 XML 字符串(反之亦然)。它做的是「Java 对象 ↔ XML」和「Java 对象 ↔ JSON」,中间必须经过对象这一层。

如何用它实现 Java 对象 ↔ XML

先确保 maven 引入正确依赖:

   com.fasterxml.jackson.dataformat   jackson-dataformat-xml   2.15.2 

然后创建 XmlMapper(它是 ObjectMapper子类,专为 XML 优化):

立即学习Java免费学习笔记(深入)”;

  • 不要用 new ObjectMapper() 处理 XML,它默认不支持 XML 注解和格式
  • 要用 new XmlMapper()new XmlMapper(new JacksonXmlModule())
  • 常见遗漏:没配置 XmlMappersetDefaultUseWrapper(false),导致生成多余外层包装标签
  • 若需兼容 JDK 17+ 的模块系统,记得添加 --add-opens java.base/java.lang=ALL-UNNAMED

示例:将对象转为 XML 字符串

XmlMapper xmlMapper = new XmlMapper(); xmlMapper.setDefaultUseWrapper(false); String xml = xmlMapper.writeValueAsString(new User("alice", 30));

为什么不能直接 JSON 字符串 ↔ XML 字符串

因为 jackson-dataformat-xml 没提供跨格式直转的 API。你看到的所谓“JSON to XML”工具,底层都是:

  • ObjectMapper 把 JSON 解析成 Jsonnode 或具体 POJO
  • 再用 XmlMapper 把同一个 JsonNode 或 POJO 写成 XML

注意风险点:

  • JsonNode 转 XML 时,数组可能变成多个同名标签,但无序或嵌套结构可能丢失(XML 无原生数组概念)
  • JSON 的 NULL 值在 XML 中无法直接表达,通常被忽略或映射为空标签,取决于 XmlMapper 配置
  • 字段名大小写、下划线/驼峰转换需统一配置,否则两边字段对不上,反序列化失败

容易踩的坑:注解和命名不一致

XML 和 JSON 对字段映射的默认行为不同:

  • @JsonProperty("user_name") 只影响 JSON;XML 默认用字段名或 getter 名,除非加 @JacksonXmlProperty(localName = "user-name")
  • @JacksonXmlRootElement(localName = "person") 控制根元素名,JSON 不认这个注解
  • 集合字段默认会被包装一层(如 ...),关掉要用 @JacksonXmlWrapped(useWrapping = false)
  • 没有 @XmlaccessorType(XmlAccessType.FIELD) 等 JAXB 注解的支持 —— jackson-dataformat-xml 不解析 JAXB 注解,只认自己的 @JacksonXml* 系列

实际开发中,如果已有 JSON 接口定义,想复用同一套 POJO 输出 XML,必须补全 @JacksonXml* 注解,不能只靠 @JsonProperty

text=ZqhQzanResources