裝置與系統問題

常見 JSON 錯誤:尾隨逗號、引號與 Unexpected token

修正無效 JSON:尾隨逗號、單引號、未加引號的鍵、Unexpected token。了解 JSON.parse 為何失敗,以及如何驗證 JSON。

快速解答

多數 JSON 錯誤來自嚴格語法:尾隨逗號、單引號、未加引號的屬性名稱、漏掉的逗號、括號不符、非法跳脫,或註解。

JSON 看起來像 JavaScript 物件,但更嚴格。屬性名稱與字串必須使用雙引號。

看到 Unexpected token 時,標出的字元可能是剖析停止的位置,不一定是最初出錯之處。

你的 JSON 被標為無效。通常是小語法問題,不是檔案格式壞掉。下面七種錯誤造成大多數 Unexpected token。

JSON 為什麼這麼容易出錯?

JSON 是語法嚴格的資料格式。JavaScript 物件常值可以長得很像,卻仍不是有效 JSON。標準 JSON 裡,屬性名稱與字串要用雙引號,不允許尾隨逗號,註解也不屬於該格式。

1. 尾隨逗號(Trailing Commas)

最後一個屬性後面多出來的逗號就是問題。標準 JSON 不允許。

無效

{
  "name": "Alex",
  "age": 30,
}

有效

{
  "name": "Alex",
  "age": 30
}

陣列同樣適用。去掉最後一項後面的逗號。

無效

[
  "red",
  "green",
]

有效

[
  "red",
  "green"
]

2. 用單引號代替雙引號

JavaScript 常常接受單引號。JSON 不接受。屬性名稱與字串值都必須用雙引號。

無效

{
  'name': 'Alex'
}

有效

{
  "name": "Alex"
}

3. 未加引號的屬性名稱

在 JavaScript 裡有時可以不帶引號寫 name。在 JSON 裡,每個屬性名稱都必須是雙引號字串。

無效

{
  name: "Alex",
  age: 30
}

有效

{
  "name": "Alex",
  "age": 30
}

4. 值之間漏掉逗號

屬性與陣列項目之間需要逗號。剖析器可能在下一個引號或括號上回報 Unexpected token,而不是在缺逗號的位置。

無效

{
  "name": "Alex"
  "age": 30
}

有效

{
  "name": "Alex",
  "age": 30
}

5. 括號或多或少

物件用 { },陣列用 [ ]。巢狀 JSON 常在缺 ]、多 },或兩者對調時失敗。數清開閉配對。

無效

{
  "items": [1, 2
}

有效

{
  "items": [1, 2]
}

6. 非法跳脫序列

JSON 字串裡,反斜線開始跳脫。"、\、\n 這類序列是合法的。把 Windows 路徑寫成 C:\Users 則不行:\U 不是合法的 JSON 跳脫。把反斜線寫成兩道,否則剖析器會停在那個字元上。

無效

{"file":"C:\Users\Alex"}

有效

{"file":"C:\\Users\\Alex"}

7. JSON 裡的註解

標準 JSON 沒有註解。有些設定工具接受 // 或 /* */(JSONC、JSON5 等)。那不是標準 JSON,JSON.parse 會拒絕。

無效

{
  // user name
  "name": "Alex"
}

Unexpected token 是什麼意思?

剖析器在該位置遇到了不允許的字元。標出的位置是讀取停止處。如果前面漏了逗號,錯誤可能指到下一個屬性的引號。措辭因執行環境而異;不要指望每個瀏覽器印出同一句話。

Unexpected end of JSON input 是什麼意思?

文字在值寫完之前就結束了。常見原因包括缺 } 或 ]、輸入被截斷、空白主體,或中途中斷的 API 回應。不是單一一種故障。

JSON.parse() 為什麼會失敗?

JSON.parse() 只接受有效的 JSON 文字。下面會成功:

const text = '{"name":"Alex"}';
const data = JSON.parse(text);

下面會失敗,因為單引號不是 JSON:

const text = "{'name':'Alex'}";
JSON.parse(text);

確切的錯誤文案取決於 JavaScript 執行環境。把訊息當線索,然後檢查該位置附近的逗號、引號和括號。

JSON 不等於 JavaScript 物件

JavaScript 物件常值可以寫成 { name: 'Alex' }。有效 JSON 必須寫成 { "name": "Alex" }:雙引號的名稱與字串,沒有尾隨逗號,沒有註解。

  • JSON 文字
  • 剖析器讀取語彙單元
  • 有效資料,或 Unexpected token
錯誤標記是剖析停止的位置,可能在真正錯誤之後。

如何快速找到 JSON 錯誤

按這個順序做。不要一開始就整份檔案重寫。

  1. 把 JSON 交給驗證器。
  2. 閱讀第一條回報的錯誤。
  3. 看回報位置稍前一點。
  4. 檢查逗號,尤其是尾隨和缺失的。
  5. 檢查引號:只能用雙引號。
  6. 配對 { } 和 [ ]。
  7. 檢查字串裡的反斜線跳脫。
  8. 若需要嚴格 JSON,去掉註解。

常見修法速查:

問題 修法
尾隨逗號刪掉最後一項後面的逗號。
單引號名稱與字串改用雙引號。
未加引號的鍵把屬性名稱包在雙引號裡。
漏掉的逗號在屬性或陣列項目之間加上逗號。
缺少的括號閉合每一對 { } 和 [ ]。
非法跳脫使用合法跳脫,或把路徑裡的反斜線寫成兩道。
註解要標準 JSON 就去掉 // 和 /* */。

在瀏覽器裡驗證並格式化 JSON

NEXNARA JSON 格式化、驗證與比對 可以在這台裝置上檢查 JSON。

可以驗證,用 2 空格、4 空格或定位字元美化,minify,比較兩份文件(JSON Diff),並開啟 .json 檔。剖析用瀏覽器裡的 JSON.parse,不用 eval。

大於 5 MB 的文件可能變慢。大於 15 MB 的文字不會在瀏覽器裡處理,以便頁面保持回應。

JSON 處理本身在你的瀏覽器裡完成。此工具不會把文字送到 NEXNARA 伺服器。廣告和其他網站功能仍會用網路;那與處理無關。

需要檢查無效 JSON?開啟 JSON 格式化、驗證與比對 並貼上文字。

FAQ

為什麼我的 JSON 提示 Unexpected token?

剖析器在該處遇到了不允許的字元。真正的錯誤——常常是漏逗號或單引號——可能就在該位置之前。

JSON 允許尾隨逗號嗎?

不允許。標準 JSON 不允許最後一個屬性或陣列項目後面有逗號。JavaScript 物件常值常常允許。

JSON 能用單引號嗎?

不能。屬性名稱與字串必須用雙引號。

JSON 能包含註解嗎?

標準 JSON 不行。有些工具接受帶註解的 JSONC 或 JSON5;JSON.parse 仍會拒絕。

JSON.parse() 為什麼失敗?

字串不是有效 JSON。常見原因是尾隨逗號、單引號、未加引號的鍵、註解,或被截斷的值。確切訊息取決於執行環境。

怎樣檢查 JSON 是否有效?

把它貼進 JSON 格式化、驗證與比對 這類驗證器,或在主控台呼叫 JSON.parse。若剖析擲出錯誤,文字就不是有效 JSON。