Java处理JSON完全指南:从入门到精通
在当今的软件开发中,JSON(JavaScript Object Notation)已经成为数据交换的事实标准,无论是调用RESTful API、读取配置文件,还是在不同系统之间传递数据,我们都不可避免地要与JSON打交道,Java作为企业级开发的中流砥柱,如何高效、便捷地处理JSON数据是每一位Java开发者必备的技能。
本文将为您详细讲解Java如何接收、解析和操作JSON,内容涵盖从原生API到主流第三方库的完整流程,并附上清晰的代码示例,助您从入门到精通。
为什么需要专门的库来处理JSON?
在解决方案之前,我们先要明白为什么Java不直接支持JSON。
JSON的格式非常灵活,包含对象(用花括号表示)和数组(用方括号[]表示),而Java是强类型语言,其核心数据类型(如String, int, boolean)和集合框架(如List, Map)无法直接与JSON这种动态结构一一对应。
一个简单的JSON对象:
{
"name": "张三",
"age": 30,
"isStudent": false,
"courses": ["数学", "物理"]
}
在Java中,我们需要将其映射到一个固定的结构上,否则无法进行类型安全的操作,手动解析字符串既繁琐又容易出错,我们需要借助强大的第三方库。
Java生态中最主流的JSON处理库有三个:
- Jackson:功能全面,性能卓越,是Spring Boot框架的默认选择。
- Gson:Google出品,API简洁易用,特别适合将Java对象与JSON字符串相互转换。
- Fastjson:阿里巴巴开源,解析速度极快,在国内应用广泛。
下面,我们将分别介绍如何使用这三种库来“接收”JSON。
使用Jackson库解析JSON
Jackson是功能最全面的库,不仅能做简单的对象映射,还支持流式处理、树模型等高级特性。
添加依赖
如果您使用Maven,在pom.xml中添加:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 请使用最新版本 -->
</dependency>
核心步骤:创建与JSON结构对应的Java类
这是最关键的一步,我们需要为上面的JSON示例创建一个POJO(Plain Old Java Object)类。
// User.java
import java.util.List;
public class User {
private String name;
private int age;
private boolean isStudent;
private List<String> courses;
// 必须有无参构造函数
public User() {
}
// 推荐:为每个字段添加getter和setter方法
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; }
// 可选:重写toString方法方便打印查看
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", isStudent=" + isStudent +
", courses=" + courses +
'}';
}
}
解析JSON字符串
我们可以将JSON字符串解析为User对象了。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false,\"courses\":[\"数学\",\"物理\"]}";
// 1. 创建ObjectMapper实例(它线程不安全,建议作为单例使用)
ObjectMapper objectMapper = new ObjectMapper();
try {
// 2. 使用readValue方法进行解析
User user = objectMapper.readValue(jsonString, User.class);
// 3. 现在可以像操作普通Java对象一样操作user
System.out.println("姓名: " + user.getName());
System.out.println("年龄: " + user.getAge());
System.out.println("是否为学生: " + user.isStudent());
System.out.println("课程列表: " + user.getCourses());
System.out.println("\n完整对象信息:");
System.out.println(user);
} catch (JsonProcessingException e) {
System.err.println("JSON解析失败: " + e.getMessage());
e.printStackTrace();
}
}
}
解析JSON数组
如果接收的是JSON数组,比如[{"name":"张三"}, {"name":"李四"}],我们可以将其解析为List<User>。
String jsonArrayString = "[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]";
// 使用 TypeReference 来指定泛型类型
List<User> userList = objectMapper.readValue(jsonArrayString, new TypeReference<List<User>>() {});
System.out.println("\n解析后的用户列表:");
userList.forEach(System.out::println);
使用Gson库解析JSON
Gson的API设计非常直观,尤其适合初学者。
添加依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 请使用最新版本 -->
</dependency>
解析JSON
Gson的使用方式与Jackson非常相似,核心类是Gson。
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class GsonExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false,\"courses\":[\"数学\",\"物理\"]}";
// 1. 创建Gson实例
Gson gson = new Gson();
// 2. 直接解析为对象
User user = gson.fromJson(jsonString, User.class);
System.out.println("使用Gson解析单个对象:");
System.out.println(user);
// 3. 解析JSON数组
String jsonArrayString = "[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]";
// 需要使用TypeToken来获取正确的List类型
Type userListType = new TypeToken<List<User>>() {}.getType();
List<User> userList = gson.fromJson(jsonArrayString, userListType);
System.out.println("\n使用Gson解析用户列表:");
userList.forEach(System.out::println);
}
}
可以看到,Gson的代码同样简洁,只是在处理泛型集合时需要借助TypeToken。
使用Fastjson解析JSON
Fastjson以其极致的性能在国内社区非常流行,其API设计也相当人性化。
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.40</version> <!-- 注意:1.x和2.x版本API不兼容,推荐使用2.x -->
</dependency>
解析JSON
Fastjson的核心类是JSON,它提供了大量静态方法。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.List;
public class FastjsonExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false,\"courses\":[\"数学\",\"物理\"]}";
// 1. 解析为对象
User user = JSON.parseObject(jsonString, User.class);
System.out.println("使用Fastjson解析单个对象:");
System.out.println(user);
// 2. 解析为JSON数组
String jsonArrayString = "[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]";
// 使用 TypeReference 来处理复杂的泛型类型
List<User> userList = JSON.parseObject(jsonArrayString, new TypeReference<List<User>>() {});
System.out.println("\n使用Fastjson解析用户列表:");
userList.forEach(System.out::println);
}
}
Fastjson 2.x的API与Jackson和Gson更为相似,易用性得到了很大提升。
总结与对比
| 特性 | Jackson | Gson | Fastjson |
|---|---|---|---|
| 性能 | 非常快 | 较快 | 极快(尤其在1.x版本) |
| 易用性 | API丰富,稍复杂 | 简单直观 | 简单,但版本间API变化大 |



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