SyntaxError: Bad escaped character in JSON at position N 表示字符串里有一个反斜杠(\)后面跟着 JSON 不认识的字符。JSON 只允许一组固定的、很小的转义序列 —— 反斜杠后面只要不是这几个就会触发这个错误。下面是完整列表和修复方式。
我遇到的是哪种字符串错误?
- Bad escaped character —— 一个
\后面跟着 JSON 不允许的字符(比如\x、Windows 路径)。 - Bad control character —— 一个未转义的原始 tab/换行/空字节出现在字符串内部。
- Unterminated string —— 字符串以
"起头但没有闭合。
错误长什么样
// 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 \xJSON 允许的全部转义
在 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只会产生格式良好的代理对。
如何修复 —— 一步步来
- 跳到报错位置,找到那个跟在无效字符前面的
\。 - 是不是孤立的反斜杠?(比如 Windows 路径)—— 把它写成
\\,或者改用正斜杠。 - 是不是外来的转义 比如
\x或\'?—— 把\xNN改成\u00NN,并去掉'前面的反斜杠。 - 是不是
\u太短? —— 补足到恰好 4 位十六进制。 - 最好的修复: 用
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、换行),根本没有反斜杠。
立刻修复
- JSON Fix —— 在浏览器里定位并修复无效的转义
- JSON 字符串里的 Bad Control Character —— 原始控制字节和转义的区别
- JSON 中的未终止字符串 —— 字符串没闭合的情况
- 如何修复 JSON.parse 的 Unexpected Token 错误 —— 更总览的错误指南