← 全部文章

JSON 中错误的转义字符:合法转义与修复

JSON 中错误的转义字符意味着反斜杠后面跟了 JSON 不允许的内容。看合法转义的完整列表,以及 \x、路径和 \u 的修复方法。

SyntaxError: Bad escaped character in JSON at position N 表示字符串里有一个反斜杠(\)后面跟着 JSON 不认识的字符。JSON 只允许一组固定的、很小的转义序列 —— 反斜杠后面只要不是这几个就会触发这个错误。下面是完整列表和修复方式。

我遇到的是哪种字符串错误?

错误长什么样

// V8 (Chrome / Node / Edge)
SyntaxError: Bad escaped character in JSON at position 14

// Firefox
SyntaxError: JSON.parse: bad escaped character at line 1 column 15 of the JSON data

// Safari
SyntaxError: JSON Parse error: Invalid escape character \x

JSON 允许的全部转义

在 JSON 字符串里,反斜杠后面只能跟下面这些当中的一个:

\"   双引号
\\   反斜杠
\/   正斜杠
\b   退格
\f   换页
\n   换行
\r   回车
\t   制表符
\uXXXX   一个 Unicode 码点(恰好 4 位十六进制)

反斜杠后面如果是别的东西 —— \x\'\a\0、像 \Users 这样的 Windows 路径,或者残缺的 \u12 —— 都会被算作「bad escaped character」。

为什么会这样

原因 1 —— 借用了其他语言的转义

// ❌ \x 和 \' 在 JS/Python 里有效,在 JSON 里不行
{ "code": "\x1b[0m", "name": "O\'Brien" }

// ✅ 用 \u 转义来表示那个字节,单引号不需要转义
{ "code": "\u001b[0m", "name": "O'Brien" }

原因 2 —— Windows 文件路径

// ❌ 每个反斜杠都开启了无效的转义
{ "path": "C:\Users\Ada\file.json" }

// ✅ 把每个反斜杠都转义(或者改用正斜杠)
{ "path": "C:\\Users\\Ada\\file.json" }
{ "path": "C:/Users/Ada/file.json" }

原因 3 —— 被截断或残缺的 \u 转义

// ❌ \u 必须正好 4 位十六进制
{ "char": "\u12" }

// ✅
{ "char": "\u0012" }

代理对和 BMP 之外的字符

JSON 的 \uXXXX 转义固定是 4 位十六进制,能表示的码点最多到 U+FFFF(基本多文种平面 BMP)。再往上的字符 —— emoji、许多 CJK 扩展、数学符号 —— 必须写成 UTF-16 代理对

// 😀 (U+1F600) 以代理对形式表示
"\uD83D\uDE00"

// 不允许 —— JSON 没有 \U 也没有 \u{...}
"\u1F600"     // 错误转义(只会读取前 4 位十六进制,剩下的当作普通文本)
"\u{1F600}"   // 错误转义

这是 JSON 的 编码方式(在转义里用 UTF-16),尽管文件本身在磁盘上是 UTF-8。有两个实际影响:

  • 文件里直接放 UTF-8 是没问题的。 你可以直接写 "😀",现代解析器都能处理。只有当你必须用转义时才需要写成代理对。
  • 小心孤立代理。 一个 \uD83D 没有配对的低位代理(或反之),JSON 规范上允许,但属于畸形 UTF-16 —— 下游消费方(特别是 Postgres 的 jsonb)会拒绝。 JSON.stringify 只会产生格式良好的代理对。

如何修复 —— 一步步来

  1. 跳到报错位置,找到那个跟在无效字符前面的 \
  2. 是不是孤立的反斜杠?(比如 Windows 路径)—— 把它写成 \\,或者改用正斜杠。
  3. 是不是外来的转义 比如 \x\'?—— 把 \xNN 改成 \u00NN,并去掉 ' 前面的反斜杠。
  4. 是不是 \u 太短? —— 补足到恰好 4 位十六进制。
  5. 最好的修复:JSON.stringify() 来生成 JSON,它只会产生合法的转义。
// 预防 —— 转义自动是对的
JSON.stringify({ path: 'C:\\Users\\Ada', code: '\x1b[0m' });
// → {"path":"C:\\Users\\Ada","code":"\u001b[0m"}

常见问题

「Bad escaped character in JSON」是什么意思?

字符串里的反斜杠后面跟了一个 JSON 不允许的转义字符(合法的只有 " \\ / b f n r t\uXXXX)。最常见的肇事者是 \x\' 和未转义的 Windows 路径。

在 JSON 里怎么写 Windows 路径?

把每个反斜杠都加倍(C:\\\\Users),让每个都构成合法的 \\ 转义;或者用正斜杠(C:/Users),JSON 接受。

这和「Bad control character」是同一回事吗?

不是。「Bad escaped character」说的是反斜杠之后出现的无效序列;「bad control character」 说的是字符串里出现了未转义的原始控制字节(tab、换行),根本没有反斜杠。

立刻修复