亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

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)。

常用注解:

项目环境搭建

  1. 在 IDE(如 Eclipse/IntelliJ)中创建 Java 项目。
  2. 项目命名为 XmlToJsonExample。
  3. 创建 data/input 文件夹,放入 sample.xml 和 sample.json。
  4. 引入 Gson 2.8.5 依赖(Maven/Gradle)。
  5. 添加 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();
}

完整转换流程

  1. 使用 JAXB 将 sample.xml 解组为 XMLModel 对象。
  2. 使用 Gson 将 Java 对象序列化为 sample.json。
  3. 使用 Gson 将 sample.json 反序列化回 Java 对象。
  4. 使用 JAXB 将 Java 对象编组为新的 XML 文件。

总结

本指南演示了清晰的两步转换管道:JAXB 负责 XML ⇄ Java,Gson 负责 JSON ⇄ Java。结合这两个库,开发者可在 Java 应用中可靠地实现数据格式互转。

java

  1. C++ 类与对象实战指南:封装、构造函数、析构函数与访问控制
  2. Java Hello World 入门教程:从 JDK 安装到编译运行第一个程序
  3. Java 封装完全指南:数据隐藏、访问器/修改器、实战案例与核心优势
  4. Java 变量与数据类型完全指南(含示例)
  5. Java String length() 方法:获取字符串长度(示例)
  6. Java String.charAt() 详解:语法、返回类型、异常与实战示例
  7. Java String.contains() 方法:检查子字符串是否存在(实战示例)
  8. 精通 Java String.endsWith():检查字符串后缀(示例)
  9. Java BufferedReader 读取文件:实战指南与示例
  10. Java 生成斐波那契数列:for 循环、while 循环与递归实现全解析
  11. Java 插入排序算法详解:核心原理、完整代码与步骤演示
  12. Java 选择排序详解:核心原理、完整代码与步骤演示