← 全部文章

JSON 中未終止的字串:原因與修復

JSON 中未終止的字串代表有開頭引號卻沒有結尾引號 —— 通常是未轉義的引號、原始換行,或被截斷的資料。錯誤與修好的範例。

SyntaxError: Unterminated string in JSON at position N 表示解析器開始讀一個字串(看到開頭的 "),然後在找到收尾的 " 之前就走到了輸入末尾 —— 或者撞上換行。字串沒有閉合。下面說為什麼會這樣以及怎麼修。

我遇到的是哪一種字串錯誤?

錯誤長什麼樣

// V8 (Chrome / Node / Edge)
SyntaxError: Unterminated string in JSON at position 27

// Firefox
SyntaxError: JSON.parse: unterminated string at line 2 column 10 of the JSON data

// Safari
SyntaxError: JSON Parse error: Unterminated string

報的位置指向(或緊貼於)那個沒閉合字串開頭的引號 —— 從那裡往後看。

為什麼會這樣

原因 1 —— 未跳脫的引號提前結束字串

值裡出現一個字面的 " 會提前結束字串;該行剩下的部分會被當成意外 token 讀,真正的字串就被「開著」。

// ❌ 壞了 —— hello 前的引號把 "He said " 關掉了
{ "note": "He said "hello" to her" }

// ✅ 修好 —— 內部引號用反斜線跳脫
{ "note": "He said \"hello\" to her" }

原因 2 —— 字串裡有原始換行

JSON 字串裡不能直接跨越原始換行。一個字面換行會把字串截斷,讓它處於未閉合狀態。

// ❌ 壞了 —— 字串裡有真實換行
{ "bio": "line one
line two" }

// ✅ 修好 —— 用 \n 跳脫,無原始換行
{ "bio": "line one\nline two" }

原因 3 —— 資料被截斷

回應在字串中間斷掉(連線中斷、緩衝/大小限制、部分讀取)會讓輸入末尾留下未閉合的字串。

// 實際收到(連線中斷):
{"user":{"name":"Ada Lovel
// → Unterminated string

怎麼修 —— 一步一步

  1. 跳到報錯位置,找到沒有配對收尾的開頭 "
  2. 找值裡有沒有未跳脫的 " —— 把它寫成 \"
  3. 找值裡有沒有原始換行/tab —— 換成 \n / \t
  4. 檢查是不是被截斷 —— 把位元組長度和 Content-Length 比一比;若短了,資料被截斷(要修程式碼,不是修文字)。
  5. 別再手工拼 JSON 了。JSON.stringify(),它會替你跳脫引號和控制字元。
// 預防:永遠不要用字串拼接做 JSON
const json = JSON.stringify({ note: userInput }); // 永遠合法

常見問題

「Unterminated string in JSON」的原因?

開頭的 " 沒有對應的收尾 " —— 通常是值裡有未跳脫的引號、原始換行,或回應在字串中間被截斷。

如何在 JSON 字串中包含引號或換行?

跳脫它們:雙引號用 \",換行用 \n,tab 用 \t。用 JSON.stringify() 來建構 JSON 會自動處理。

這跟「Unexpected end of JSON input」一樣嗎?

相關但不同。「Unterminated string」表示有一個字串開著;「Unexpected end of JSON input」 表示整個結構(物件/陣列)提前結束。回應被截斷兩者都可能觸發。

立刻修復