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 錯誤 —— 更總覽性的錯誤指南