- 将一个 Java 对象列表(如
List)转换为 JSON 格式的字符串,这是最常见的需求,通常用于将数据发送给前端或其他服务。 - 将一个 JSON 格式的字符串解析(转换)成 Java 对象列表,这是第一种情况的逆操作。
下面我将分别详细介绍这两种情况,并提供完整的代码示例。

将 Java 对象列表(List)转为 JSON 字符串
要实现这个功能,我们需要一个 JSON 处理库,目前最流行和推荐的是 Jackson 和 Gson。
方法 1:使用 Jackson (推荐)
Jackson 是一个功能强大、性能极高的 JSON 处理库,是 Spring Boot 等框架的默认选择。
添加依赖
如果你使用 Maven,在 pom.xml 中添加:

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
如果你使用 Gradle,在 build.gradle 中添加:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2' // 使用最新版本
创建 Java 类
你需要一个 Java 类来表示 JSON 数组中的对象。
// User.java
public class User {
private String name;
private int age;
private String email;
// 无参构造器是 Jackson 反序列化时需要的
public User() {
}
// 带参构造器方便创建对象
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// Getter 和 Setter 是 Jackson 序列化和反序列化必需的
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 String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
// (可选) 重写 toString() 方便打印和调试
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
}
执行转换

使用 Jackson 的 ObjectMapper 将 List<User> 转换为 JSON 字符串。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;
public class JacksonListToJson {
public static void main(String[] args) {
// 1. 创建 ObjectMapper 实例
ObjectMapper objectMapper = new ObjectMapper();
// 2. 创建一个 User 对象列表
List<User> userList = Arrays.asList(
new User("Alice", 30, "alice@example.com"),
new User("Bob", 24, "bob@example.com"),
new User("Charlie", 35, "charlie@example.com")
);
try {
// 3. 将 List 转换为 JSON 字符串
// objectMapper.writeValueAsString() 是最直接的方法
String jsonString = objectMapper.writeValueAsString(userList);
// 4. 输出结果
System.out.println(jsonString);
// 如果你想要格式化(美化)输出,可以使用 writerWithDefaultPrettyPrinter()
String prettyJsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(userList);
System.out.println("\n美化后的 JSON:");
System.out.println(prettyJsonString);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
输出结果:
[{"name":"Alice","age":30,"email":"alice@example.com"},{"name":"Bob","age":24,"email":"bob@example.com"},{"name":"Charlie","age":35,"email":"charlie@example.com"}]
美化后的 JSON:
[
{
"name" : "Alice",
"age" : 30,
"email" : "alice@example.com"
},
{
"name" : "Bob",
"age" : 24,
"email" : "bob@example.com"
},
{
"name" : "Charlie",
"age" : 35,
"email" : "charlie@example.com"
}
]
方法 2:使用 Google Gson
Gson 是 Google 开发的另一个非常流行的 JSON 库,使用起来同样非常方便。
添加依赖
Maven (pom.xml):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>
Gradle (build.gradle):
implementation 'com.google.code.gson:gson:2.10.1' // 使用最新版本
执行转换
Gson 的使用非常直观,直接创建 Gson 实例并调用 toJson() 方法。
import com.google.gson.Gson;
import java.util.Arrays;
import java.util.List;
public class GsonListToJson {
public static void main(String[] args) {
// 1. 创建 Gson 实例
Gson gson = new Gson();
// 2. 创建 User 对象列表 (User 类与上面 Jackson 示例中的相同)
List<User> userList = Arrays.asList(
new User("Alice", 30, "alice@example.com"),
new User("Bob", 24, "bob@example.com"),
new User("Charlie", 35, "charlie@example.com")
);
// 3. 将 List 转换为 JSON 字符串
String jsonString = gson.toJson(userList);
// 4. 输出结果
System.out.println(jsonString);
// Gson 默认不提供美化输出的方法,但可以通过 GsonBuilder 实现
Gson prettyGson = new GsonBuilder().setPrettyPrinting().create();
String prettyJsonString = prettyGson.toJson(userList);
System.out.println("\n美化后的 JSON:");
System.out.println(prettyJsonString);
}
}
输出结果:
与 Jackson 的输出格式基本一致。
将 JSON 字符串转为 Java 对象列表
这是上述过程的逆操作,也称为“反序列化”。
使用 Jackson
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonJsonToList {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
// 假设这是从前端或 API 接收到的 JSON 字符串
String jsonString = "[{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"},{\"name\":\"Bob\",\"age\":24,\"email\":\"bob@example.com\"}]";
try {
// 关键点:使用 TypeReference 来告诉 Jackson 目标集合的具体类型
// 如果直接写 List.class,Jackson 无法知道 List 里面装的是什么类型的对象
List<User> userList = objectMapper.readValue(jsonString, new TypeReference<List<User>>() {});
// 输出结果进行验证
System.out.println(userList);
userList.forEach(System.out::println);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
输出结果:
[User{name='Alice', age=30, email='alice@example.com'}, User{name='Bob', age=24, email='bob@example.com'}]
User{name='Alice', age=30, email='alice@example.com'}
User{name='Bob', age=24, email='bob@example.com'}
使用 Gson
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class GsonJsonToList {
public static void main(String[] args) {
Gson gson = new Gson();
String jsonString = "[{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"},{\"name\":\"Bob\",\"age\":24,\"email\":\"bob@example.com\"}]";
// 关键点:使用 TypeToken 来获取泛型类型
Type userListType = new TypeToken<List<User>>() {}.getType();
List<User> userList = gson.fromJson(jsonString, userListType);
// 输出结果进行验证
System.out.println(userList);
userList.forEach(System.out::println);
}
}
输出结果:
与 Jackson 的输出结果一致。
总结与对比
| 特性 | Jackson | Gson |
|---|---|---|
| 流行度 | 非常高,Spring Boot 默认选择 | 非常高,Google 出品 |
| 性能 | 通常被认为性能更优 | 性能也非常好,略有差距 |
| API 风格 | 功能全面,配置复杂度稍高 | API 简洁直观,易于上手 |
| 核心对象 | ObjectMapper |
Gson |
| JSON 字符串转 List | objectMapper.read(json, new TypeReference<List<T>>(){}) |
gson.fromJson(json, new TypeToken<List<T>>(){}.getType()) |
| 美化输出 | objectMapper.writerWithDefaultPrettyPrinter() |
new GsonBuilder().setPrettyPrinting().create() |
如何选择?
- 如果你正在使用 Spring Boot 或其他 Jakarta EE/Jakarta EE 框架,直接使用 Jackson,因为它已经包含在依赖中,无需额外引入。
- 如果你需要一个简单、快速、易于集成的解决方案,Gson 是一个绝佳的选择,它的 API 对新手非常友好。
- 如果对性能有极致要求,可以做一些基准测试,但在大多数应用场景下,两者性能差异可以忽略不计。
对于大多数项目来说,两者都是优秀的选择,选择哪一个往往取决于项目的技术栈和个人偏好。
