SyntaxError: Unterminated string in JSON at position N 表示解析器開始讀一個字串(看到開頭的 "),然後在找到收尾的 " 之前就走到了輸入末尾 —— 或者撞上換行。字串沒有閉合。下面說為什麼會這樣以及怎麼修。
我遇到的是哪一種字串錯誤?
- Unterminated string —— 字串以
"開頭但沒結束。 - Bad control character —— 未跳脫的原始 tab/換行/空位元組出現在字串內部。
- Bad escaped character —— 一個
\後面跟著 JSON 不允許的東西(例如\x、Windows 路徑)。
錯誤長什麼樣
// 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怎麼修 —— 一步一步
- 跳到報錯位置,找到沒有配對收尾的開頭
"。 - 找值裡有沒有未跳脫的
"—— 把它寫成\"。 - 找值裡有沒有原始換行/tab —— 換成
\n/\t。 - 檢查是不是被截斷 —— 把位元組長度和
Content-Length比一比;若短了,資料被截斷(要修程式碼,不是修文字)。 - 別再手工拼 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」 表示整個結構(物件/陣列)提前結束。回應被截斷兩者都可能觸發。
立刻修復
- JSON Fix —— 在瀏覽器裡找出未結束的字串並修好
- Unexpected End of JSON Input —— 整個結構被截斷的情況
- JSON 字串字面量裡的 Bad Control Character —— 字串中的原始 tab/換行
- JSON 裡的 Bad Escaped Character —— 非法的反斜線跳脫