准备工作:添加依赖
你需要在你的项目中添加相应库的依赖,如果你使用 Maven 或 Gradle,可以按以下方式添加。

Jackson (推荐)
Jackson 是目前 Java 生态中最流行、性能最好的 JSON 库。
Maven 依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
Google Gson
Gson 是 Google 开发的,非常易于使用,API 设计简洁。
Maven 依赖:

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>
Alibaba Fastjson
Fastjson 是阿里巴巴开源的,解析速度极快,但在过去版本中存在一些安全漏洞,目前新版本已修复,但仍需谨慎使用。
Maven 依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.40</version> <!-- 强烈建议使用 2.x 版本 -->
</dependency>
示例:Java 对象、JSON 字符串 和 JSON 互相转换
我们用一个 User 类作为示例。
// User.java
public class User {
private String name;
private int age;
private String[] hobbies;
// 无参构造函数是必须的,用于反序列化
public User() {
}
// 有参构造函数
public User(String name, int age, String[] hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
// 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 String[] getHobbies() { return hobbies; }
public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }
// 重写 toString() 方便打印对象内容
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", hobbies=" + Arrays.toString(hobbies) +
'}';
}
}
Jackson 示例
Jackson 的核心类是 ObjectMapper。

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class JacksonExample {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
// 1. Java 对象 -> JSON 字符串
User user = new User("张三", 30, new String[]{"阅读", "游泳"});
String jsonString = objectMapper.writeValueAsString(user);
System.out.println("Java 对象 -> JSON 字符串:");
System.out.println(jsonString);
// 输出: {"name":"张三","age":30,"hobbies":["阅读","游泳"]}
// 2. JSON 字符串 -> Java 对象
User userFromJson = objectMapper.readValue(jsonString, User.class);
System.out.println("\nJSON 字符串 -> Java 对象:");
System.out.println(userFromJson);
// 输出: User{name='张三', age=30, hobbies=[阅读, 游泳]}
// 3. JSON 字符串 -> Java List
String jsonArrayString = "[{\"name\":\"李四\",\"age\":25,\"hobbies\":[\"游戏\"]},{\"name\":\"王五\",\"age\":28,\"hobbies\":[\"音乐\",\"电影\"]}]";
List<User> userList = objectMapper.readValue(jsonArrayString, new TypeReference<List<User>>() {});
System.out.println("\nJSON 字符串 -> Java List:");
userList.forEach(System.out::println);
/* 输出:
User{name='李四', age=25, hobbies=[游戏]}
User{name='王五', age=28, hobbies=[音乐, 电影]}
*/
// 4. JSON 字符串 -> Java Map
String jsonMapString = "{\"key1\":\"value1\",\"key2\":123}";
Map<String, Object> map = objectMapper.readValue(jsonMapString, new TypeReference<Map<String, Object>>() {});
System.out.println("\nJSON 字符串 -> Java Map:");
System.out.println(map);
// 输出: {key1=value1, key2=123}
}
}
Gson 示例
Gson 的核心类是 Gson,使用非常直观。
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
// 1. Java 对象 -> JSON 字符串
User user = new User("张三", 30, new String[]{"阅读", "游泳"});
String jsonString = gson.toJson(user);
System.out.println("Java 对象 -> JSON 字符串:");
System.out.println(jsonString);
// 输出: {"name":"张三","age":30,"hobbies":["阅读","游泳"]}
// 2. JSON 字符串 -> Java 对象
User userFromJson = gson.fromJson(jsonString, User.class);
System.out.println("\nJSON 字符串 -> Java 对象:");
System.out.println(userFromJson);
// 输出: User{name='张三', age=30, hobbies=[阅读, 游泳]}
// 3. JSON 字符串 -> Java List
String jsonArrayString = "[{\"name\":\"李四\",\"age\":25,\"hobbies\":[\"游戏\"]},{\"name\":\"王五\",\"age\":28,\"hobbies\":[\"音乐\",\"电影\"]}]";
// 需要使用 TypeToken 来处理泛型集合
List<User> userList = gson.fromJson(jsonArrayString, new TypeToken<List<User>>() {}.getType());
System.out.println("\nJSON 字符串 -> Java List:");
userList.forEach(System.out::println);
/* 输出:
User{name='李四', age=25, hobbies=[游戏]}
User{name='王五', age=28, hobbies=[音乐, 电影]}
*/
// 4. JSON 字符串 -> Java Map
String jsonMapString = "{\"key1\":\"value1\",\"key2\":123}";
Map<String, Object> map = gson.fromJson(jsonMapString, new TypeToken<Map<String, Object>>() {}.getType());
System.out.println("\nJSON 字符串 -> Java Map:");
System.out.println(map);
// 输出: {key1=value1, key2=123}
}
}
Fastjson 示例
Fastjson 的 API 非常简洁,但需要注意版本 2.x 的 API 与 1.x 有较大不同,这里使用 Fastjson 2.x。
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class FastjsonExample {
public static void main(String[] args) {
// 1. Java 对象 -> JSON 字符串
User user = new User("张三", 30, new String[]{"阅读", "游泳"});
String jsonString = JSON.toJSONString(user);
System.out.println("Java 对象 -> JSON 字符串:");
System.out.println(jsonString);
// 输出: {"name":"张三","age":30,"hobbies":["阅读","游泳"]}
// 2. JSON 字符串 -> Java 对象
User userFromJson = JSON.parseObject(jsonString, User.class);
System.out.println("\nJSON 字符串 -> Java 对象:");
System.out.println(userFromJson);
// 输出: User{name='张三', age=30, hobbies=[阅读, 游泳]}
// 3. JSON 字符串 -> Java List
String jsonArrayString = "[{\"name\":\"李四\",\"age\":25,\"hobbies\":[\"游戏\"]},{\"name\":\"王五\",\"age\":28,\"hobbies\":[\"音乐\",\"电影\"]}]";
// 使用 TypeReference 处理复杂类型
List<User> userList = JSON.parseObject(jsonArrayString, new TypeReference<List<User>>() {}.getType());
System.out.println("\nJSON 字符串 -> Java List:");
userList.forEach(System.out::println);
/* 输出:
User{name='李四', age=25, hobbies=[游戏]}
User{name='王五', age=28, hobbies=[音乐, 电影]}
*/
// 4. JSON 字符串 -> Java Map
String jsonMapString = "{\"key1\":\"value1\",\"key2\":123}";
Map<String, Object> map = JSON.parseObject(jsonMapString, new TypeReference<Map<String, Object>>() {}.getType());
System.out.println("\nJSON 字符串 -> Java Map:");
System.out.println(map);
// 输出: {key1=value1, key2=123}
}
}
总结与对比
| 特性 | Jackson | Gson | Fastjson (2.x) |
|---|---|---|---|
| 性能 | 非常高,业界标杆 | 高,但略逊于 Jackson | 极高,号称最快 |
| 易用性 | API 功能强大但略显复杂,泛型处理需 TypeReference |
非常简单直观,API 设计优雅 | API 极其简洁,易用性高 |
| 生态 | 最成熟,Spring Framework 默认使用 | 成熟稳定,社区广泛 | 阿里巴巴生态,国内使用广泛 |
| 功能 | 功能全面,支持流式处理、树模型等 | 功能齐全,专注于 JSON 转换 | 功能强大,支持 JSON, JSONB 等 |
| 安全性 | 相对安全,社区活跃修复问题 | 相对安全 | x 版本曾爆出高危漏洞,x 版本已修复,但仍需关注 |
| 推荐场景 | 首选,特别是大型项目、对性能要求高的项目、Spring 生态项目 | 新手友好,中小型项目,追求简洁 API 的项目 | 对性能有极致要求,且能接受其背景风险的国内项目 |
如何选择?
- 如果你不确定用哪个,或者正在使用 Spring Boot,请选择 Jackson。 它是事实上的标准,性能和生态都无可挑剔。
- 如果你是个人项目、小型应用,或者希望代码尽可能简单,可以选择 Gson。 它的 API 非常友好,学习曲线平缓。
- 如果你在阿里巴巴的技术栈中工作,或者对 JSON 解析速度有极致的追求(例如处理海量数据),可以考虑 Fastjson 2.x。 但请务必使用最新版本,并关注其安全公告。
希望这个详细的解释和示例能帮助你理解如何在 Java 中进行 JSON 和 String 的转换!
