(主标题+副标题,兼顾SEO与可读性)
Java String 转 JSON:2025年最全指南(5种方法+代码示例+避坑)
从入门到精通,彻底解决 JSONObject、Gson、Jackson 选择困难症,附性能对比与最佳实践

Meta Description)
还在为 Java String 转 JSON 报错而烦恼?本文详细讲解 2025 年最主流的 5 种方法,包括原生 org.json、Gson、Jackson、Fastjson2 和 org.json,提供完整代码示例、性能对比和常见陷阱解析,无论你是新手还是资深开发者,都能在这里找到最适合你的解决方案,轻松掌握 Java 字符串与 JSON 之间的转换。
引言:为什么我们需要将 Java String 转 JSON?
在当今的微服务架构和前后端分离的开发模式中,JSON(JavaScript Object Notation)已成为数据交换的事实标准,作为 Java 开发者,我们经常需要与外部系统交互,
- 调用第三方 RESTful API,接收到的响应体是 JSON 格式的字符串。
- 从配置文件中读取 JSON 配置。
- 将复杂的对象序列化为 JSON 字符串进行存储或传输。
从网络或文件中获取的数据往往是一个普通的 java.lang.String 类型,我们不能直接对这个字符串进行 get("key") 这样的操作,必须先将其解析(Parse)成 JSON 对象(如 JSONObject 或自定义的 POJO),这就是“Java String 转 JSON”这一核心需求的由来。
本文将带你系统地学习如何高效、安全地完成这一转换,并为你提供在不同场景下的最佳选择。

前置准备:你的 String 是合法的 JSON 吗?
在开始转换之前,最重要的一步是验证你的 String 是否是一个格式良好的 JSON,一个合法的 JSON 字符串必须符合其语法规范,
- 使用双引号 包裹键和字符串值。
- 键和值之间用冒号 分隔。
- 键值对之间用逗号 分隔。
- 数组使用方括号
[],对象使用花括号 。
一个常见的错误是使用单引号 ,这在 JSON 中是不合法的。
错误示例:
String badJson = "{'name': '张三', 'age': 30}"; // 错误:使用了单引号
正确示例:
String goodJson = "{\"name\": \"张三\", \"age\": 30}"; // 正确:使用转义后的双引号

如果你的字符串格式不正确,任何解析库都会抛出 JSONException 或 JsonSyntaxException,在转换前进行校验是一个好习惯。
五种主流转换方法详解(附代码示例)
我们将介绍五种在 Java 开发中最为流行和实用的方法,覆盖从轻量级到功能强大的各种库。
使用 org.json (原生库,无需额外依赖)
org.json 是一个非常轻量级的 JSON 处理库,无需引入第三方依赖(如果使用 Java EE 或 Jakarta EE,它通常已包含),非常适合快速、简单的任务。
添加依赖 (Maven):
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20251013</version> <!-- 使用最新版本 -->
</dependency>
核心代码:
import org.json.JSONObject;
public class OrgJsonExample {
public static void main(String[] args) {
// 1. 准备一个合法的 JSON 字符串
String jsonString = "{\"name\": \"李四\", \"age\": 25, \"isStudent\": false, \"courses\": [\"Math\", \"Science\"]}";
// 2. 直接使用 JSONObject 构造函数进行转换
JSONObject jsonObject = new JSONObject(jsonString);
// 3. 像操作 Map 一样操作 JSON 对象
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean isStudent = jsonObject.getBoolean("isStudent");
String firstCourse = jsonObject.getJSONArray("courses").getString(0);
System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.println("Is Student: " + isStudent);
System.out.println("First Course: " + firstCourse);
// 4. 也可以反向转换回 String
String jsonStringAgain = jsonObject.toString();
System.out.println("\nConverted back to String: " + jsonStringAgain);
}
}
优点:
- 轻量,无额外依赖(在很多环境中)。
- API 简单直观,上手快。
缺点:
- 功能相对基础,不支持将 JSON 直接绑定到 Java 对象(POJO)。
使用 Google Gson (灵活易用)
Gson 是 Google 出品的一个强大的 Java JSON 库,它不仅能轻松解析 JSON,还能将 JSON 字符串直接反序列化为自定义的 Java 对象(POJO),这是它最强大的功能。
添加依赖 (Maven):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>
核心代码:
场景 A:解析为 JsonObject(类似方法一)
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class GsonJsonObjectExample {
public static void main(String[] args) {
String jsonString = "{\"name\": \"王五\", \"age\": 28}";
// 1. 创建 JsonParser 实例
JsonParser parser = new JsonParser();
// 2. 解析字符串,得到 JsonElement
JsonElement jsonElement = parser.parse(jsonString);
// 3. 转换为 JsonObject
JsonObject jsonObject = jsonElement.getAsJsonObject();
String name = jsonObject.get("name").getAsString();
int age = jsonObject.get("age").getAsInt();
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
场景 B:解析为自定义 Java 对象(POJO) - 这是 Gson 的精髓!
import com.google.gson.Gson;
// 1. 首先定义一个与 JSON 结构匹配的 Java 类
class User {
private String name;
private int age;
// 必须有无参构造函数
public User() {}
// Getter 和 Setter 方法(Gson 依赖反射来访问它们)
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; }
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
public class GsonPojoExample {
public static void main(String[] args) {
String jsonString = "{\"name\": \"赵六\", \"age\": 32}";
// 1. 创建 Gson 实例
Gson gson = new Gson();
// 2. 直接 fromJson 将字符串转换为我们定义的 User 对象
User user = gson.fromJson(jsonString, User.class);
// 3. 现在你可以直接使用 user 对象
System.out.println(user);
System.out.println("User's name: " + user.getName());
}
}
优点:
- 功能强大,支持 JSON 与 POJO 的双向转换。
- API 设计优秀,易于使用。
- 活跃的社区和丰富的文档。
缺点:
- 需要额外引入依赖。
使用 FasterXML Jackson (工业级标准)
Jackson 是目前 Java 生态中最流行、性能最高的 JSON 处理库,是 Spring Framework 默认的 JSON 处理库,它的功能和性能都堪称一流。
添加依赖 (Maven):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
核心代码: Jackson 的用法与 Gson 非常相似,也支持直接解析为 POJO。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
// User 类的定义与 Gson 示例中相同
class User { ... }
public class JacksonExample {
public static void main(String[] args) {
String jsonString = "{\"name\": \"钱七\", \"age\": 40}";
ObjectMapper objectMapper = new ObjectMapper(); // 创建核心对象
try {
// 方法一:解析为 JsonNode (类似 JsonObject/JsonElement)
JsonNode jsonNode = objectMapper.readTree(jsonString);
String name = jsonNode.get("name").asText();
int age = jsonNode.get("age").asInt();
System.out.println("Via JsonNode - Name: " + name + ", Age: " + age);
// 方法二:直接解析为 POJO 对象 (更常用)
User user = objectMapper.readValue(jsonString, User.class);
System.out.println("Via POJO - " + user);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
优点:
- 性能极高,在大型 JSON 或高频场景下优势明显。
- 功能极其丰富,支持数据绑定、流式 API、树模型等。
- 与 Spring 生态无缝集成。
缺点:
- 对于新手,API 可能比 Gson 稍微复杂一点。
使用阿里巴巴 Fastjson2 (高性能国产选择)
Fastjson 是阿里巴巴开源的 JSON 库,以其极致的性能著称,虽然经历过一些版本风波,但 Fastjson2 版本已经重构,更加稳定和安全,是许多国内大厂的首选。
添加依赖 (Maven):
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.40</version> <!-- 使用最新版本 -->
</dependency>
核心代码: Fastjson2 的 API 设计非常简洁,一行代码即可完成转换。
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
// User 类的定义与 Gson 示例中相同
class User { ... }
public class Fastjson2Example {
public static void main(String[] args) {
String jsonString = "{\"name\": \"孙八\", \"age\": 22}";
// 方法一:解析为 JSONObject
JSONObject jsonObject = JSON.parseObject(jsonString);
System.out.println("Name: " + jsonObject.getString("name"));
System.out.println("Age: " + jsonObject.getIntValue("age"));
// 方法二:直接解析为 POJO 对象
User user = JSON.parseObject(jsonString, User.class);
System.out.println("Via POJO - " + user);
// 方法三:序列化 POJO 为 JSON 字符串
String userJsonString = JSON.toJSONString(user);
System.out.println("Serialized to JSON: " + userJsonString);
}
}
优点:
- 性能顶尖,尤其在序列化方面。
- API 极其简洁,易用性高。
- 对国人友好,文档和社区支持良好。
缺点:
- 需要关注其安全更新,确保使用最新稳定版。
手动解析(不推荐,但需了解)
在某些极端情况下(如无法引入任何第三方库),你可以手动解析字符串,但这通常意味着你需要使用 String.indexOf()、String.substring() 等方法,或者正则表达式,代码会非常繁琐、脆弱且难以维护。
示例(仅作演示,切勿在生产环境使用):
public class ManualParsingExample {
public static void main(String[] args) {
String jsonString = "{\"name\": \"周九\", \"age\": 35}";
// 极其脆弱的代码!
String name = jsonString.substring(jsonString.indexOf("\"name\"") + 8, jsonString.indexOf("\"", jsonString.indexOf("\"name\"") + 9));
String ageStr = jsonString.substring(jsonString.indexOf("\"age\"") + 7, jsonString.indexOf("}", jsonString.indexOf("\"age\"") + 7));
System.out.println("Name: " + name);
System.out.println("Age: " + ageStr);
}
}
除非有特殊限制,否则强烈不推荐手动解析,使用成熟的库能为你节省大量时间并避免无数潜在的 bug。
性能与易用性对比:我该选哪个?
| 特性 | org.json | Google Gson | FasterXML Jackson | Alibaba Fastjson2 |
|---|---|---|---|---|
| 易用性 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 性能 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 功能丰富度 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| POJO支持 | ❌ | ✅ | ✅ | ✅ |
| 依赖大小 | 极小 | 小 | 中 | 中 |
| 推荐场景 | 快速原型、无依赖环境 | 通用开发、中小型项目 | 大型项目、高性能要求、Spring生态 | 国内电商、极致性能要求 |
选择建议:
- 新手入门 / 小型项目 / 快速验证: 优先选择 Gson 或 Fastjson2,它们的 API 直观,POJO 转换功能强大,能让你快速聚焦于业务逻辑。
- 企业级应用 / 大型项目 / Spring Boot: Jackson 是不二之选,它是行业标准,性能卓越,与 Spring 生态深度集成,稳定性和社区支持都有保障。
- 追求极致性能 / 国内大厂项目: Fastjson2 值得重点考虑,它在多项基准测试中都名列前茅,是国内开发者的骄傲。
- 零依赖环境 / 简单脚本: 如果环境允许,org.json 是最轻量的选择。
常见陷阱与最佳实践
-
处理日期和时间: JSON 本身没有日期类型,通常使用字符串(如 ISO-8601 格式)表示,直接转换可能导致格式问题,所有主流库都提供了日期格式化工具,务必配置。
- Gson 示例:
new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create() - Jackson 示例:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")注解在字段上。
- Gson 示例:
-
处理 null 值: 默认情况下,
Gson和Jackson会忽略null值,如果你需要保留null字段,需要进行配置。- Gson 示例:
new GsonBuilder().serializeNulls().create() - Jackson 示例:
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS)
- Gson 示例:
-
异常处理: JSON 解析可能会因为格式错误、类型不匹配等抛出异常。务必使用
try-catch块来捕获JsonSyntaxException、JsonProcessingException等,避免程序崩溃。 -
安全性: 防止 JSON 注入攻击,虽然不常见,但如果 JSON 字符串来自不可信来源,确保你使用的库是安全的,并避免将解析后的内容直接拼接到 SQL 或 HTML 中。
Java String 转 JSON 是一项基础且高频的操作,本文我们系统地学习了五种主流方法:
org.json:轻量,适合简单场景。Gson:灵活易用,POJO 转换首选之一。Jackson:工业级标准,性能与功能兼具。Fastjson2:国产高性能之选,API 简洁。- 手动解析:了解即可,切勿在生产中使用。
没有绝对的“最好”,只有“最适合”,根据你的项目需求、性能要求和团队熟悉度来选择合适的工具,掌握这些方法,你将能游刃有余地处理任何与 JSON 相关的开发任务。
希望这篇详尽的指南能对你有所帮助!如果你觉得有用,欢迎点赞、收藏并分享给更多有需要的开发者。
(可选)SEO优化与互动引导
- 关键词布局: 文章标题、各级标题、正文首段、代码注释、总结部分都自然地植入了核心关键词“java string 转 json”以及相关长尾关键词如“java json 解析”、“json字符串转对象”、“gson jackson 区别”等。
- 内链/外链: 可以在文中链接到相关库的官方文档,增加权威性。
- 评论互动: 在文末可以设置一个互动问题,“你在项目中最喜欢使用哪个 JSON 库?为什么?欢迎在评论区留言讨论!” 以增加用户粘性和页面停留时间。
