Java 解析 JSON 文件:从入门到精通的完整指南
在当今的软件开发中,JSON(JavaScript Object Notation)已成为数据交换的事实标准,它轻量、易读、易于解析,广泛应用于 Web API、配置文件和数据存储,作为一名 Java 开发者,如何高效地解析 JSON 文件是一项必备技能,本文将带你全面了解 Java 中解析 JSON 的多种方法,从最基础的库到现代流行的框架,并提供清晰的代码示例。
为什么需要解析 JSON?
在开始之前,我们先明确一下“解析”的含义,解析 JSON,就是将 JSON 格式的字符串或文件,转换成 Java 语言中可以操作的对象(如 List、Map 或自定义的 JavaBean),这个过程也称为“反序列化”(Deserialization),一旦数据变成了 Java 对象,我们就可以方便地进行业务逻辑处理、数据修改和重新序列化(转换回 JSON 字符串)。
Java 解析 JSON 的三大主流方案
Java 生态中有多种处理 JSON 的库,各有优劣,目前最主流的有三种:
- Gson:Google 出品,轻量级,API 简洁,功能强大。
- Jackson:社区活跃,性能卓越,功能极其丰富,是 Spring Boot 等框架的默认选择。
- org.json:一个非常轻量级的库,API 简单,适合处理简单的 JSON 数据。
下面我们将详细介绍这三种库的使用方法。
使用 Google Gson
Gson 是最受欢迎的 JSON 库之一,它的设计哲学是让开发者用最少的代码完成 JSON 和 Java 对象的转换。
添加依赖
如果你使用 Maven,在 pom.xml 中添加:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 请使用最新版本 -->
</dependency>
解析 JSON 文件
假设我们有一个名为 user.json 的文件,内容如下:
{
"name": "张三",
"age": 30,
"isStudent": false,
"courses": [
"Java编程",
"数据结构"
],
"address": {
"city": "北京",
"district": "海淀区"
}
}
步骤 1:创建对应的 JavaBean
为了方便映射,我们为 JSON 数据创建对应的 Java 类。
// User.java
import java.util.List;
import java.util.Map;
public class User {
private String name;
private int age;
private boolean isStudent;
private List<String> courses;
private Address address;
// Address.java
public static class Address {
private String city;
private String district;
// Getters and Setters
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
public String getDistrict() { return district; }
public void setDistrict(String district) { this.district = district; }
}
// Getters and Setters for User class
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public boolean isStudent() { return isStudent; }
public void setStudent(boolean student) { isStudent = student; }
public List<String> getCourses() { return courses; }
public void setCourses(List<String> courses) { this.courses = courses; }
public Address getAddress() { return address; }
public void setAddress(Address address) { this.address = address; }
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", isStudent=" + isStudent +
", courses=" + courses +
", address=" + address +
'}';
}
}
步骤 2:编写解析代码
import com.google.gson.Gson;
import java.io.FileReader;
import java.io.IOException;
public class GsonParser {
public static void main(String[] args) {
// 1. 创建 Gson 实例
Gson gson = new Gson();
try {
// 2. 从文件读取 JSON 数据
FileReader reader = new FileReader("user.json");
// 3. 直接将 JSON 数据解析为 User 对象
User user = gson.fromJson(reader, User.class);
// 4. 关闭文件流
reader.close();
// 5. 使用解析后的对象
System.out.println("解析成功!");
System.out.println(user);
System.out.println("城市: " + user.getAddress().getCity());
} catch (IOException e) {
e.printStackTrace();
}
}
}
优点:
- API 非常直观,
fromJson()方法是核心。 - 自动处理复杂的嵌套对象和数组。
- 与注解(如
@SerializedName)结合使用,可以灵活处理 JSON 字段名与 Java 属性名不匹配的情况。
使用 Jackson
Jackson 是功能最强大、性能最高的 JSON 库,是许多大型项目的首选,Spring Boot 默认使用它进行 JSON 序列化和反序列化。
添加依赖
Maven 依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 请使用最新版本 -->
</dependency>
解析 JSON 文件
我们使用相同的 user.json 文件和 User.java 类。
步骤 1:创建 ObjectMapper
ObjectMapper 是 Jackson 库的核心类,负责所有的读和写操作。
步骤 2:编写解析代码
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
public class JacksonParser {
public static void main(String[] args) {
// 1. 创建 ObjectMapper 实例
ObjectMapper objectMapper = new ObjectMapper();
try {
// 2. 读取 JSON 文件到 User 对象
// Jackson 可以直接从 File 对象读取
User user = objectMapper.readValue(new File("user.json"), User.class);
// 3. 使用解析后的对象
System.out.println("解析成功!");
System.out.println(user);
System.out.println("第一个课程: " + user.getCourses().get(0));
} catch (IOException e) {
e.printStackTrace();
}
}
}
优点:
- 性能卓越:解析速度非常快,适合处理大数据量。
- 功能极其丰富:支持流式 API(
JsonParser,JsonGenerator)处理大文件,支持树模型(JsonNode)灵活遍历 JSON,强大的注解支持(如@JsonProperty,@JsonFormat)。 - 生态系统完善:与 Spring、JAX-RS 等框架无缝集成。
使用 org.json
这是一个极简的库,如果你只需要进行简单的 JSON 操作,不希望引入复杂的依赖,它是一个不错的选择。
添加依赖
Maven 依赖:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version> <!-- 请使用最新版本 -->
</dependency>
解析 JSON 文件
这个库不直接与 JavaBean 绑定,而是将 JSON 解析为 JSONObject 和 JSONArray 等通用对象,你需要手动从中提取数据。
import org.json.JSONObject;
import org.json.JSONArray;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class OrgJsonParser {
public static void main(String[] args) {
try {
// 1. 读取整个 JSON 文件内容为字符串
StringBuilder jsonContent = new StringBuilder();
try (FileReader reader = new FileReader("user.json")) {
int c;
while ((c = reader.read()) != -1) {
jsonContent.append((char) c);
}
}
// 2. 将字符串解析为 JSONObject
JSONObject jsonObject = new JSONObject(jsonContent.toString());
// 3. 从 JSONObject 中提取数据
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean isStudent = jsonObject.getBoolean("isStudent");
// 4. 处理嵌套的 JSON 对象
JSONObject addressJson = jsonObject.getJSONObject("address");
String city = addressJson.getString("city");
// 5. 处理 JSON 数组
JSONArray coursesArray = jsonObject.getJSONArray("courses");
String firstCourse = coursesArray.getString(0);
// 6. 打印结果
System.out.println("解析成功!");
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("


还没有评论,来说两句吧...