裝置與系統問題
常見 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 執行環境。把訊息當線索,然後檢查該位置附近的逗號、引號和括號。
JavaScript 物件常值可以寫成 { name: 'Alex' }。有效 JSON 必須寫成 { "name": "Alex" }:雙引號的名稱與字串,沒有尾隨逗號,沒有註解。
- JSON 文字
- 剖析器讀取語彙單元
- 有效資料,或 Unexpected token
如何快速找到 JSON 錯誤
按這個順序做。不要一開始就整份檔案重寫。
- 把 JSON 交給驗證器。
- 閱讀第一條回報的錯誤。
- 看回報位置稍前一點。
- 檢查逗號,尤其是尾隨和缺失的。
- 檢查引號:只能用雙引號。
- 配對 { } 和 [ ]。
- 檢查字串裡的反斜線跳脫。
- 若需要嚴格 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。