Skip to content

Java XML 和 JSON 处理

XML (eXtensible Markup Language) 和 JSON (JavaScript Object Notation) 是当今最流行的数据交换格式。无论是调用 Web 服务、读取配置文件还是在不同系统间传输数据,都离不开它们。本章将介绍在 Java 中处理这两种格式的常用方法。

处理 XML

XML 是一种基于标签的标记语言,结构严谨,曾广泛用于配置文件和 SOAP Web 服务。Java 提供了多种处理 XML 的 API。

JAXB (Java Architecture for XML Binding)

JAXB 是一个强大的 API,它可以将 Java 对象编组 (Marshal) 为 XML,以及将 XML 解组 (Unmarshal) 回 Java 对象,实现了对象与 XML 之间的自动映射。

要使用 JAXB,需要定义一个与 XML 结构匹配的 Java 类,并使用 JAXB 注解来标记它。

java
// 1. 定义一个 Java 类,使用 JAXB 注解
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;

@XmlRootElement
public class Customer {
    private String name;
    private int age;

    @XmlElement
    public void setName(String name) { this.name = name; }
    public String getName() { return name; }

    @XmlElement
    public void setAge(int age) { this.age = age; }
    public int getAge() { return age; }
}
java
// 2. 编组 (Java 对象 -> XML)
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.File;

public class JaxbMarshalExample {
    public static void main(String[] args) throws Exception {
        Customer customer = new Customer();
        customer.setName("John Doe");
        customer.setAge(30);

        JAXBContext context = JAXBContext.newInstance(Customer.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 格式化输出

        // 输出到控制台
        marshaller.marshal(customer, System.out);
        // 输出到文件
        marshaller.marshal(customer, new File("customer.xml"));
    }
}
// 输出的 XML:
// <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
// <customer>
//     <age>30</age>
//     <name>John Doe</name>
// </customer>

注意: 从 Java 9 开始,JAXB 不再是标准库的一部分,需要作为单独的依赖项添加到项目中。

处理 JSON

JSON 是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。它已成为 RESTful API 的事实标准。

Java 标准库没有内置的 JSON 处理 API,但有许多优秀的第三方库可供选择,其中最流行的是:

  • Jackson: 功能非常强大,性能优秀,是 Spring 等许多主流框架的默认选择。
  • Gson: 由 Google 开发,API 简洁易用,非常适合简单的 JSON-对象映射。

使用 Jackson

Jackson 的核心组件是 ObjectMapper,它可以轻松地在 Java 对象和 JSON 字符串之间进行转换。

java
// 1. 定义一个简单的 POJO (Plain Old Java Object)
public class Car {
    private String brand;
    private int doors;

    // 需要 getter 和 setter,以及一个无参构造方法
    public Car() {}
    public Car(String brand, int doors) { this.brand = brand; this.doors = doors; }

    public String getBrand() { return brand; }
    public void setBrand(String brand) { this.brand = brand; }
    public int getDoors() { return doors; }
    public void setDoors(int doors) { this.doors = doors; }
}
java
// 2. 序列化 (Java 对象 -> JSON) 和反序列化 (JSON -> Java 对象)
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // --- 序列化 ---
        Car car = new Car("Toyota", 4);
        String jsonString = objectMapper.writeValueAsString(car);
        System.out.println("序列化后的 JSON: " + jsonString);
        // 输出: {"brand":"Toyota","doors":4}

        // --- 反序列化 ---
        String jsonToParse = "{\"brand\":\"Ford\",\"doors\":2}";
        Car parsedCar = objectMapper.readValue(jsonToParse, Car.class);
        System.out.println("反序列化后的品牌: " + parsedCar.getBrand()); // 输出: Ford
    }
}

使用 Gson

Gson 的用法与 Jackson 类似,主要通过 Gson 类来操作。

java
import com.google.gson.Gson;

public class GsonExample {
    public static void main(String[] args) {
        Gson gson = new Gson();

        // --- 序列化 ---
        Car car = new Car("Honda", 4);
        String jsonString = gson.toJson(car);
        System.out.println("序列化后的 JSON: " + jsonString);
        // 输出: {"brand":"Honda","doors":4}

        // --- 反序列化 ---
        String jsonToParse = "{\"brand\":\"BMW\",\"doors\":2}";
        Car parsedCar = gson.fromJson(jsonToParse, Car.class);
        System.out.println("反序列化后的品牌: " + parsedCar.getBrand()); // 输出: BMW
    }
}

选择哪个库通常取决于项目的需求。对于需要高度定制和最佳性能的复杂项目,Jackson 是更好的选择。对于简单的数据绑定任务,Gson 的简洁性可能更具吸引力。

本站内容仅供学习和研究使用。