JAXB是Java原生XML绑定框架,支持对象与XML双向转换;Java 9起移出JDK,需手动引入jakarta.xml.bind-api和jaxb-runtime依赖,并通过注解、Marshaller/Unmarshaller实现序列化与反序列化。

JAXB(Java Architecture for XML Binding)是Java原生支持的XML绑定框架,能自动将Java对象序列化为XML,也能将XML反序列化为Java对象,无需手动解析。从Java 9开始JAXB被移出JDK核心模块,需单独引入依赖;Java 11及以后版本默认不包含,必须显式添加。
添加JAXB依赖(Java 9+)
若使用Maven,在pom.xml中加入:
- jakarta.xml.bind:jakarta.xml.bind-api(API接口)
- org.glassfish.jaxb:jaxb-runtime(运行时实现)
示例:
jakarta.xml.bind jakarta.xml.bind-api 4.0.0 org.glassfish.jaxb jaxb-runtime 4.0.3
定义可绑定的Java类(加注解)
用@XmlRootElement标记根元素,用@XmlElement控制字段映射,必要时用@XmlAttribute映射属性。建议配合@XmlAccessorType(XmlAccessType.FIELD)避免写getter/setter注解。
立即学习“Java免费学习笔记(深入)”;
示例:
import jakarta.xml.bind.annotation.*;
@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
@XmlElement(name = "name")
private String name;
@XmlElement(name = "age")
private int age;
@XmlAttribute(name = "id")
private long id;
// 无参构造函数必需
public Person() {}
public Person(String name, int age, long id) {
this.name = name;
this.age = age;
this.id = id;
}
}
Java对象转XML(Marshalling)
使用JAXBContext创建上下文,再获取Marshaller进行序列化。可设置格式化输出、编码等。
- 调用marshaller.marshal(),支持输出到File、OutputStream、Writer或DOMResult
- 启用格式化:marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true)
- 指定编码:marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8")
示例:
JAXBContext context = JAXBContext.newInstance(Person.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
Person p = new Person("张三", 28, 1001L);
marshaller.marshal(p, System.out);
输出:
张三 28
XML转Java对象(Unmarshalling)
同样通过JAXBContext获取Unmarshaller,调用unmarshal()方法解析XML源(File、InputStream、StringReader等)。
- 注意:XML根元素名需与@XmlRootElement声明一致,否则抛UnmarshalException
- 可设置setSchema()做XSD校验(可选)
- 若XML含命名空间,Java类需用@XmlSchema或@XmlNs配合
示例:
String xml = ""; StringReader reader = new StringReader(xml); JAXBContext context = JAXBContext.newInstance(Person.class); Unmarshaller unmarshaller = context.createUnmarshaller(); Person person = (Person) unmarshaller.unmarshal(reader); 李四 32
常见注意事项
确保Java类满足JAXB要求:
- 必须有public无参构造函数
- 字段或getter/setter需有对应JAXB注解,或按默认规则(public字段、遵循JavaBean命名的getter/setter)
- 集合类型需用@XmlElement包裹,推荐搭配List和泛型(如List
),并用@XmlElementWrapper生成外层包装标签 - 避免使用final字段、静态字段、瞬态字段(transient)——默认不参与绑定
不复杂但容易忽略










