Jackson-dataformat-xml是Jackson框架的重要扩展组件,主要作用是让Jackson能够解析和生成XML格式的数据,同时也因为Jackson本身对JSON的支持能力,自然实现了XML和JSON两种格式的互相转换能力,在Java项目中处理多格式数据交互时非常实用。

Jackson-dataformat-xml的核心作用
Jackson本身是Java生态中非常流行的JSON处理库,默认只支持JSON格式的序列化与反序列化。Jackson-dataformat-xml作为扩展模块,为Jackson补充了XML处理能力,它底层基于Woodstox XML解析器实现,性能和稳定性都有保障。它的核心能力包括三个方面:
- 将Java对象序列化为XML格式字符串
- 将XML格式字符串反序列化为Java对象
- 借助Jackson的JSON处理能力,实现XML和JSON的双向转换
环境准备
如果使用Maven管理项目依赖,需要在pom.xml中添加以下依赖,核心依赖是jackson-dataformat-xml,同时它会自动依赖Jackson的核心库和Woodstox解析器:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.15.2</version>
</dependency>
如果是Gradle项目,添加对应的依赖配置即可,版本可以根据实际需求选择稳定的Jackson版本。
Java对象与XML的转换
首先定义需要转换的Java实体类,使用Jackson的注解可以自定义XML的节点名称、属性等配置:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
// 指定XML根节点名称为user
@JacksonXmlRootElement(localName = "user")
public class User {
// 指定XML节点名称为user_id,作为属性而非子节点
@JacksonXmlProperty(localName = "user_id", isAttribute = true)
private Integer id;
@JacksonXmlProperty(localName = "user_name")
private String name;
@JacksonXmlProperty(localName = "user_age")
private Integer age;
// 省略getter、setter和构造方法
}
接下来实现Java对象转XML的操作,需要创建XmlMapper对象,它是Jackson处理XML的核心入口,和JSON处理的ObjectMapper用法类似:
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class XmlDemo {
public static void main(String[] args) throws Exception {
XmlMapper xmlMapper = new XmlMapper();
User user = new User();
user.setId(1);
user.setName("张三");
user.setAge(25);
// Java对象转XML字符串
String xmlStr = xmlMapper.writeValueAsString(user);
System.out.println("XML结果:");
System.out.println(xmlStr);
// XML字符串转Java对象
User parsedUser = xmlMapper.readValue(xmlStr, User.class);
System.out.println("解析后的用户姓名:" + parsedUser.getName());
}
}
上述代码运行后,生成的XML内容如下,根节点是user,id作为根节点的属性,name和age作为子节点:
<user user_id="1">
<user_name>张三</user_name>
<user_age>25</user_age>
</user>
XML与JSON的互相转换
因为Jackson同时支持XML和JSON的处理,所以实现两者的转换不需要额外的复杂逻辑,只需要分别用XmlMapper和ObjectMapper处理即可。
XML转JSON
可以先将XML解析为JsonNode对象,再将JsonNode序列化为JSON字符串,这样不需要提前定义对应的Java实体类:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class XmlToJsonDemo {
public static void main(String[] args) throws Exception {
String xmlContent = "<user user_id="1"><user_name>张三</user_name><user_age>25</user_age></user>";
XmlMapper xmlMapper = new XmlMapper();
ObjectMapper jsonMapper = new ObjectMapper();
// XML转JsonNode
JsonNode jsonNode = xmlMapper.readTree(xmlContent.getBytes());
// JsonNode转JSON字符串
String jsonStr = jsonMapper.writeValueAsString(jsonNode);
System.out.println("转换后的JSON:");
System.out.println(jsonStr);
}
}
转换后的JSON结果会保留XML的节点结构,属性会作为JSON对象的键值对存在:
{
"user": {
"user_id": "1",
"user_name": "张三",
"user_age": "25"
}
}
JSON转XML
反过来,JSON转XML的逻辑也是类似的,先解析JSON为JsonNode,再用XmlMapper将JsonNode序列化为XML:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class JsonToXmlDemo {
public static void main(String[] args) throws Exception {
String jsonContent = "{"user":{"user_id":"1","user_name":"张三","user_age":"25"}}";
ObjectMapper jsonMapper = new ObjectMapper();
XmlMapper xmlMapper = new XmlMapper();
// JSON转JsonNode
JsonNode jsonNode = jsonMapper.readTree(jsonContent);
// JsonNode转XML字符串
String xmlStr = xmlMapper.writeValueAsString(jsonNode);
System.out.println("转换后的XML:");
System.out.println(xmlStr);
}
}
注意事项
使用Jackson-dataformat-xml处理转换时,有几个需要关注的点:
- XML的命名空间和复杂嵌套结构可能需要额外配置注解才能正确解析,简单的业务结构基本不需要额外处理
- 默认情况下XML的属性会被解析为JSON中带@前缀的键,如果需要自定义映射规则,可以配置
XmlMapper的特性 - 如果项目同时需要JSON和XML处理,注意不要混淆
ObjectMapper和XmlMapper的使用场景,前者处理JSON,后者处理XML
如果遇到转换结果不符合预期的情况,可以先打印中间解析出来的JsonNode结构,确认解析逻辑是否正确,再调整对应的注解或者配置。
Jackson-dataformat-xmlXML与JSON转换Java_xml处理Jackson修改时间:2026-06-26 06:36:36