← 全部文章

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、換行),根本沒有反斜線。

立刻修復