1. 概述
在这篇简短的教程中,我们将介绍几种在 Java 中对 JSON 字符串进行转义的方法。
我们会快速浏览几个主流的 JSON 处理库,并看看它们是如何让“转义”这件事变得简单又可靠的。
2. 为什么不能直接拼接字符串?
考虑一个常见场景:我们要将用户输入的消息发送到某个 Web 接口。最天真的写法可能是这样的:
String payload = "{\"message\":\"" + message + "\"}";
sendMessage(payload);
但这样写其实问题多多。
最简单的情况是,如果 message
包含了双引号 "Hello "World""
,那结果就直接炸了:
{ "message" : "My "message" breaks json" }
更严重的是,用户甚至可以利用这种拼接方式改变整个请求语义。比如用户输入:
Hello", "role" : "admin
那最终生成的 JSON 就变成了:
{ "message" : "Hello", "role" : "admin" }
✅ 这显然不是我们想看到的结果。
一种看似可行的“土味”做法是手动替换引号:
String payload = "{\"message\":\"" + message.replace("\"", "\\\"") + "\"}";
但这种方式非常脆弱:
- ❌ 每次拼接字符串都得手动转义
- ❌ 容易遗漏或重复转义
- ❌ 随着结构变复杂,维护成本飙升
- ❌ 可读性差,容易出错
⚠️ 所以,我们需要更通用、更安全的方案。
可惜的是,Java 原生的 JSON 支持还在 JEP 阶段,所以我们还得靠第三方库。
好在市面上有不少成熟的 JSON 库,我们来看看其中最常用的三个。
3. 使用 JSON-java(org.json)
这是最轻量的 JSON 库之一,也叫 org.json
。
构造 JSON 对象的方式非常直观,就像操作 Map 一样:
JSONObject jsonObject = new JSONObject();
jsonObject.put("message", "Hello \"World\"");
String payload = jsonObject.toString();
输出结果:
{
"message" : "Hello \"World\""
}
✅ 优点:API 简洁,适合轻量级场景
❌ 缺点:功能较弱,不适合复杂对象序列化
4. 使用 Jackson
Jackson 是 Java 生态中最强大的 JSON 处理库之一,功能丰富、扩展性强。
用法上和 org.json
类似:
Map<String, Object> params = new HashMap<>();
params.put("message", "Hello \"World\"");
String payload = new ObjectMapper().writeValueAsString(params);
当然,Jackson 更强大的地方在于它支持 Java 对象的序列化。
比如我们可以定义一个类:
class Payload {
Payload(String message) {
this.message = message;
}
String message;
// getters and setters
}
然后直接序列化对象:
String payload = new ObjectMapper().writeValueAsString(new Payload("Hello \"World\""));
输出结果同样是:
{
"message" : "Hello \"World\""
}
💡 如果你已经手动转义过某个字段,不想让 Jackson 再次转义,可以用 @JsonRawValue
注解。
5. 使用 Gson
Gson 是 Google 出品的 JSON 库,常拿来和 Jackson 对比。
同样支持两种方式:
5.1 手动构造 JsonObject
JsonObject json = new JsonObject();
json.addProperty("message", "Hello \"World\"");
String payload = new Gson().toJson(json);
5.2 使用对象序列化
String payload = new Gson().toJson(new Payload("Hello \"World\""));
输出结果和前面一样:
{
"message" : "Hello \"World\""
}
✅ Gson 使用简单,适合 Android 开发者
⚠️ Jackson 功能更强大,适合服务端开发
6. 总结
本文我们介绍了在 Java 中正确转义 JSON 的几种方式,并对比了三个主流库的用法:
库名 | 优点 | 缺点 |
---|---|---|
org.json | 轻量、API 简单 | 功能有限,不适合复杂结构 |
Jackson | 功能强大,生态完善 | 配置复杂,学习成本稍高 |
Gson | 使用简单,适合移动端 | 扩展性不如 Jackson |
📌 建议:
- 如果只是临时处理 JSON,可以用
org.json
- 如果是服务端开发,推荐使用 Jackson
- 如果是 Android 开发,Gson 是不错的选择
所有示例代码可在 GitHub 找到。