JAXB是Java Architecture for XML Binding的缩写,是Java SE中自带的XML与Java对象映射工具,不需要额外引入第三方依赖就可以实现对象和XML的双向转换,在接口数据交互、配置文件解析等场景中应用广泛。

JAXB核心注解说明
使用JAXB转换对象前,需要先通过注解配置实体类和XML的映射关系,常用的注解如下:
- @XmlRootElement:标注在类上,指定XML的根节点名称
- @XmlElement:标注在字段或getter方法上,指定字段对应的XML子节点名称
- @XmlAttribute:标注在字段或getter方法上,指定字段对应的XML节点属性
- @XmlTransient:标注在字段或getter方法上,指定该字段不参与XML转换
实体类定义示例
首先定义一个用户实体类,通过JAXB注解配置映射规则:
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
@XmlAttribute(name = "id")
private Integer id;
@XmlElement(name = "user_name")
private String userName;
@XmlElement(name = "age")
private Integer age;
@XmlTransient
private String password; // 密码字段不参与转换
// 必须提供无参构造器,JAXB反射创建对象需要
public User() {
}
public User(Integer id, String userName, Integer age, String password) {
this.id = id;
this.userName = userName;
this.age = age;
this.password = password;
}
// getter和setter方法省略
}
对象转XML实现
将Java对象转换为XML字符串的步骤如下:
- 创建JAXBContext实例,指定要转换的实体类
- 创建Marshaller对象,用于执行对象到XML的转换
- 配置Marshaller的输出属性,比如是否格式化输出
- 调用marshal方法执行转换
具体代码实现:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
public class ObjectToXmlDemo {
public static void main(String[] args) throws Exception {
// 创建测试对象
User user = new User(1, "张三", 25, "123456");
// 创建JAXBContext,指定处理的类
JAXBContext context = JAXBContext.newInstance(User.class);
// 创建Marshaller对象
Marshaller marshaller = context.createMarshaller();
// 设置格式化输出,生成的XML会有缩进
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 设置编码
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
// 输出到字符串
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
String xmlResult = writer.toString();
System.out.println("对象转XML结果:");
System.out.println(xmlResult);
}
}
上述代码执行后输出的XML内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user id="1">
<user_name>张三</user_name>
<age>25</age>
</user>
XML转对象实现
将XML字符串转换为Java对象的步骤和对象转XML相反:
- 创建JAXBContext实例,指定要转换的实体类
- 创建Unmarshaller对象,用于执行XML到对象的转换
- 调用unmarshal方法传入XML内容,得到转换后的对象
具体代码实现:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class XmlToObjectDemo {
public static void main(String[] args) throws Exception {
// 要转换的XML字符串
String xmlContent = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>n" +
"<user id="1">n" +
" <user_name>张三</user_name>n" +
" <age>25</age>n" +
"</user>";
// 创建JAXBContext
JAXBContext context = JAXBContext.newInstance(User.class);
// 创建Unmarshaller对象
Unmarshaller unmarshaller = context.createUnmarshaller();
// 执行转换,传入StringReader
User user = (User) unmarshaller.unmarshal(new StringReader(xmlContent));
System.out.println("XML转对象结果:");
System.out.println("用户ID:" + user.getId());
System.out.println("用户名:" + user.getUserName());
System.out.println("年龄:" + user.getAge());
// password字段被@XmlTransient标注,不会从XML中读取,为null
System.out.println("密码:" + user.getPassword());
}
}
注意事项
- 被JAXB处理的实体类必须提供无参构造器,否则反射创建对象时会抛出异常
- 如果实体类有继承关系,需要在父类和子类上都配置对应的JAXB注解
- 从Java 9开始,JAXB模块被标记为 deprecated,Java 11之后默认不再包含JAXB依赖,如果需要使用需要手动引入相关依赖包
- 处理大XML文件时,建议使用流式解析结合JAXB的方式,避免一次性加载整个XML到内存造成内存溢出
JAXB对象_XML互转Java_XML解析注解配置修改时间:2026-07-02 15:21:47