Skip to content
JSON 工具2026-08-283 分钟阅读

现象:中文被转成了 \uXXXX

你把一个含中文的 JSON 粘进格式化工具,结果输出里的中文变成了这样:

{
  "name": "\u4e2d\u6587",
  "city": "\u5317\u4eac"
}

明明想看的是 "北京",却变成了一串 \uXXXX 形式的字符。很多人第一反应以为是"乱码"或"工具坏了"。其实不是——这是 JSON 完全合法的 Unicode 转义,而且数据并没有损坏

为什么会出现这种转义

JSON 字符串规范允许用 \uXXXX 来表示任意 Unicode 字符(XXXX 是 4 位十六进制码点)。问题出在生成 JSON 的一方默认开启了 "ASCII-only" 输出:

| 语言 / 库 | 默认行为 | 是否转义中文 | |---|---|---| | Python json.dumps() | ensure_ascii=True(默认) | ✅ 转义成 \uXXXX | | Java Jackson | ESCAPE_NON_ASCII(常见默认) | ✅ 转义 | | JavaScript JSON.stringify() | 不转义 | ❌ 保留中文 | | Go encoding/json | 不转义 | ❌ 保留中文 |

所以你看到的 \u5317\u4eac 就是 "北京" 的 UTF-16 码点表示,只是显示形式不同,含义完全一样

怎么还原成中文

方法一:用在线工具一键还原(推荐)

打开 ToolVault 工具匣 的 JSON 格式化工具,把这段 JSON 粘进去:

  1. 工具默认以"可读"形式展示,中文会直接显示为正常的 北京
  2. 如果你需要强制保留或强制展开转义,在选项里切换"转义非 ASCII"开关即可;
  3. 全程在浏览器本地解析,数据不会上传到任何服务器。

提示:JSON.parse() 本身就会自动把转义还原成字符。真正麻烦的是生成端默认转义,而展示端如实显示了原始内容。

方法二:从代码层面避免转义

如果你是自己生成 JSON,把 ASCII-only 关掉就行:

import json
data = {"name": "中文", "city": "北京"}
# 默认会转义成 \uXXXX
print(json.dumps(data))
# 关闭转义,保留中文
print(json.dumps(data, ensure_ascii=False))
const data = { name: '中文', city: '北京' };
// JSON.stringify 默认就保留中文,不会转义
console.log(JSON.stringify(data));
// Jackson:关闭非 ASCII 转义
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false);
String json = mapper.writeValueAsString(data);

什么时候该保留转义

并不是所有场景都要还原。以下情况保留 \uXXXX 反而更安全:

  • 日志 / 配置文件要兼容只认 ASCII 的老系统;
  • 跨语言传输时,对方解析器对 UTF-8 支持不好;
  • 避免 BOM / 编码声明不一致导致的二次乱码。

一句话:人要看 → 还原成中文;机器要稳 → 保留转义。

FAQ

\uXXXX 是乱码吗?

不是。它是 Unicode 码点的标准转义写法,任意 JSON 解析器都能无损还原。真正的乱码通常是 GBK/UTF-8 编码错配导致的 中文 这种看不懂的字符。

为什么我的 JSON 在浏览器里能显示中文,粘到工具里就变转义了?

很可能是复制的来源(后端接口、日志)本身就是 ASCII-only 输出。工具只是如实显示了原始内容。用上面的方法一可以让它可读展示。

还原后会改变数据吗?

不会。转义和非转义是同一段数据的两种文本表示,解析后得到的字符串字节完全一致。


本文由 ToolVault 工具匣 提供。更多 JSON 相关工具:JSON DiffJSONPath 查询JSON Schema 校验。访问 首页 查看更多开发者工具。


广告