Java 实现 JSON 与 XML 互转:Gson 与 JAXB 详细指南
什么是 JSON?
JSON(JavaScript Object Notation)是一种轻量级、语言无关的数据交换格式,采用键值对结构,广泛用于文件存储、数据库存储及网络传输。
{ "username": "guru99user", "email": "guru99user@mail.com" }
主要特征:
- 使用花括号
{}包裹。 - 键和字符串值需加双引号。
- 键值对之间用逗号分隔。
- 键命名规则:字母、数字、下划线,不能以数字或空格开头。
什么是 XML?
XML(eXtensible Markup Language)是 W3C 标准的结构化数据格式。与 HTML 不同,XML 纯粹用于数据描述,不包含视觉渲染信息。支持自定义标签,适合跨系统数据交换。
典型节点结构:
<node>内容</node>
XML 文件头必须声明版本:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
什么是 Gson?
Gson 是 Google 开源的 Java 库,用于 Java 对象与 JSON 的相互序列化/反序列化。自 1.6 版起支持流式读写(JsonReader、JsonWriter)。
流式写入示例:
JsonWriter writer = new JsonWriter(new FileWriter(filePath));
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
writer.close();
什么是 JAXB?
JAXB(Java Architecture for XML Binding)通过注解将 Java 类映射为 XML。支持编组(Java → XML)和解组(XML → Java)。
常用注解:
@XmlRootElement– 定义根 XML 元素。@XmlElementWrapper– 包装集合类型。@XmlElement– 将字段映射为 XML 元素。@XmlAttribute– 将字段映射为 XML 属性。
项目环境搭建
- 在 IDE(如 Eclipse/IntelliJ)中创建 Java 项目。
- 项目命名为 XmlToJsonExample。
- 创建
data/input文件夹,放入sample.xml和sample.json。 - 引入 Gson 2.8.5 依赖(Maven/Gradle)。
- 添加 JAXB API(Java 8 内置;Java 9+ 需单独引入)。
示例数据结构
包含部门、角色、人员的 XML 示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<department>
<roles>
<role id="1">
<position>head</position>
<salary>10k</salary>
</role>
<role id="2">
<position>manager</position>
<salary>8k</salary>
</role>
<role id="3">
<position>employee</position>
<salary>5k</salary>
</role>
</roles>
<persons>
<person id="1"><name>Red</name><role>1</role></person>
<person id="2"><name>Green</name><role>2</role></person>
<person id="3"><name>Blue</name><role>2</role></person>
<person id="4"><name>Yellow</name><role>3</role></person>
<person id="5"><name>Brown</name><role>3</role></person>
</persons>
</department>
</root>
等价的 JSON 结构:
{
"roles": [
{"id":"1","position":"head","salary":"10k","persons":[{"id":"1","name":"Red"}]},
{"id":"2","position":"manager","salary":"8k","persons":[{"id":"2","name":"Green"},{"id":"3","name":"Blue"}]},
{"id":"3","position":"employee","salary":"5k","persons":[{"id":"4","name":"Yellow"},{"id":"5","name":"Brown"}]}
]
}
Java 实体类定义(model 包)
/* Role.java */
@XmlRootElement(name = "role")
public class Role {
private String id, position, salary;
// getter/setter 需配合 @XmlAttribute/@XmlElement
}
/* Person.java */
@XmlRootElement(name = "person")
public class Person {
private String id, name, role;
// getter/setter 需配合 @XmlAttribute/@XmlElement
}
/* Department.java */
@XmlRootElement(name = "department")
public class Department {
private List<Role> roles;
private List<Person> persons;
// getter/setter 需配合 @XmlElementWrapper/@XmlElement
}
/* XMLModel.java */
@XmlRootElement(name = "root")
public class XMLModel {
private Department department;
// getter/setter 需配合 @XmlElement
}
XML 反序列化为 Java 对象(JAXB)
public XMLModel getObjectFromXmlFile(String path) throws JAXBException {
File file = new File(path);
JAXBContext ctx = JAXBContext.newInstance(XMLModel.class);
Unmarshaller um = ctx.createUnmarshaller();
return (XMLModel) um.unmarshal(file);
}
Java 对象序列化为 XML(JAXB)
public void parseObjectToXml(String path, XMLModel model) throws JAXBException, IOException {
JAXBContext ctx = JAXBContext.newInstance(XMLModel.class);
Marshaller m = ctx.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(model, new FileOutputStream(path));
}
Java 对象序列化为 JSON(Gson)
public void writeDataToJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException {
JsonWriter writer = new JsonWriter(new FileWriter(path));
writer.setIndent(" ");
writer.beginObject();
writer.name("roles").beginArray();
for (Role r : roles) {
writer.beginObject();
writer.name("id").value(r.getId());
writer.name("position").value(r.getPosition());
writer.name("salary").value(r.getSalary());
writer.name("persons").beginArray();
for (Person p : persons) {
if (p.getRole().equals(r.getId())) {
writer.beginObject();
writer.name("id").value(p.getId());
writer.name("name").value(p.getName());
writer.endObject();
}
}
writer.endArray();
writer.endObject();
}
writer.endArray();
writer.endObject();
writer.close();
}
JSON 反序列化为 Java 对象(Gson)
public void getDataFromJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException {
JsonReader reader = new JsonReader(new FileReader(path));
reader.beginObject();
while (reader.hasNext()) {
String rootName = reader.nextName();
if ("roles".equals(rootName)) {
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
Role r = new Role();
while (reader.hasNext()) {
String key = reader.nextName();
switch (key) {
case "id": r.setId(reader.nextString()); break;
case "position": r.setPosition(reader.nextString()); break;
case "salary": r.setSalary(reader.nextString()); break;
case "persons":
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
Person p = new Person();
p.setRole(r.getId());
while (reader.hasNext()) {
String pKey = reader.nextName();
if ("id".equals(pKey)) p.setId(reader.nextString());
else if ("name".equals(pKey)) p.setName(reader.nextString());
}
persons.add(p);
reader.endObject();
}
reader.endArray();
break;
}
}
roles.add(r);
reader.endObject();
}
reader.endArray();
}
}
reader.endObject();
reader.close();
}
完整转换流程
- 使用 JAXB 将
sample.xml解组为XMLModel对象。 - 使用 Gson 将 Java 对象序列化为
sample.json。 - 使用 Gson 将
sample.json反序列化回 Java 对象。 - 使用 JAXB 将 Java 对象编组为新的 XML 文件。
总结
本指南演示了清晰的两步转换管道:JAXB 负责 XML ⇄ Java,Gson 负责 JSON ⇄ Java。结合这两个库,开发者可在 Java 应用中可靠地实现数据格式互转。
java
- C++ 类与对象实战指南:封装、构造函数、析构函数与访问控制
- Java Hello World 入门教程:从 JDK 安装到编译运行第一个程序
- Java 封装完全指南:数据隐藏、访问器/修改器、实战案例与核心优势
- Java 变量与数据类型完全指南(含示例)
- Java String length() 方法:获取字符串长度(示例)
- Java String.charAt() 详解:语法、返回类型、异常与实战示例
- Java String.contains() 方法:检查子字符串是否存在(实战示例)
- 精通 Java String.endsWith():检查字符串后缀(示例)
- Java BufferedReader 读取文件:实战指南与示例
- Java 生成斐波那契数列:for 循环、while 循环与递归实现全解析
- Java 插入排序算法详解:核心原理、完整代码与步骤演示
- Java 选择排序详解:核心原理、完整代码与步骤演示