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 找到。


原始标题:Escape JSON String in Java