常見 JSON 語法錯誤及如何使用驗證器修復它們
常見 JSON 錯誤
JSON 嚴格的語法規則意味著即使是一個放錯位置的字元也可能破壞整份文件。了解最常見的 JSON 錯誤將幫助你更快除錯,避免重複犯同樣的錯誤。以下是開發者最常遇到的問題,每個問題都附帶清晰的說明和修復方法。
1. 結尾逗號
錯誤: 物件或陣列結尾處出現 Unexpected token
結尾逗號在 JavaScript 物件和陣列中是允許的,但在 JSON 中嚴格禁止。
無效的 JSON:
{
"name": "Alice",
"age": 30,
}
修復: 移除最後一個元素之後的逗號。
{
"name": "Alice",
"age": 30
}
帶結尾逗號的陣列:
// 無效
[1, 2, 3,]
// 有效
[1, 2, 3]
2. 鍵名缺少引號或引號不正確
錯誤: Unexpected identifier 或 Expected double-quoted property name
JSON 要求所有物件鍵名必須用雙引號包裹。單引號和不加引號的鍵名都是無效的,即使它們在 JavaScript 中可以運作。
無效的 JSON:
{
name: "Alice",
'occupation': "Engineer"
}
修復: 始終使用雙引號包裹鍵名。
{
"name": "Alice",
"occupation": "Engineer"
}
3. 字串值使用單引號
錯誤: Unexpected identifier 或 Unterminated string
與鍵名一樣,JSON 中的字串值也必須使用雙引號。單引號是無效的。
無效的 JSON:
{ "greeting": 'Hello, world!' }
修復: 將單引號替換為雙引號。
{ "greeting": "Hello, world!" }
提示: 如果你的字串包含雙引號,請使用反斜線轉義:"He said, \"Hello\""。
4. 未轉義的特殊字元
錯誤: Unexpected token 或 Invalid character
某些字元在 JSON 字串中必須轉義:雙引號(")、反斜線(\)和控制字元。
無效的 JSON:
{
"path": "C:\Users\Documents\file.json",
"quote": "He said "hello""
}
修復: 正確轉義反斜線和雙引號。
{
"path": "C:\\Users\\Documents\\file.json",
"quote": "He said \"hello\""
}
JSON 轉義序列完整列表
| 序列 | 表示 |
|----------|-----------|
| \" | 雙引號 |
| \\ | 反斜線 |
| \/ | 正斜線 |
| \b | 退格 |
| \f | 換頁 |
| \n | 換行 |
| \r | 回車 |
| \t | 製表符 |
| \uXXXX | Unicode 字元(例如 \u00e9 表示 é) |
5. 無效的數字格式
錯誤: Unexpected number 或 Invalid number
JSON 對數字的格式有特定規則:
- 不允許前導零(
01無效) - 只有數字
0允許有一個前導零 - 數字不能有結尾小數點(
10.無效) - 不支援十六進位、八進位和二進位格式
無效的 JSON:
{
"invalid1": 01,
"invalid2": 10.,
"invalid3": 0xFF,
"invalid4": 1,000
}
修復:
{
"valid1": 1,
"valid2": 10.0,
"valid3": 255,
"valid4": 1000
}
6. 無效值:undefined、NaN、Infinity
錯誤: undefined、NaN、Infinity 的 Unexpected token
JavaScript 中有一些值沒有對應的 JSON 類型。這些值會導致解析錯誤:
無效的 JSON:
{
"undefinedVal": undefined,
"notANumber": NaN,
"infinity": Infinity
}
修復: 替換為有效的 JSON 值或使用約定方式。
{
"undefinedVal": null,
"notANumber": null,
"infinity": 1.7976931348623157e+308
}
7. 多餘的逗號或缺少逗號
錯誤: Expected comma 或 Unexpected token
JSON 中的逗號必須分隔每個鍵/值對和陣列元素,但不能出現在最後一個元素之後。
缺少逗號(無效):
{
"name": "Alice"
"age": 30
}
修復: 加上缺少的逗號。
{
"name": "Alice",
"age": 30
}
8. 深度巢狀結構問題
錯誤: Maximum call stack size exceeded 或解析器逾時
雖然不是語法錯誤,但深度巢狀的 JSON(10 層以上)可能導致效能問題,並使除錯極其困難。
有問題的結構:
{
"level1": {
"level2": {
"level3": {
"level4": {
"level5": {
"level6": {
"value": "too deep"
}
}
}
}
}
}
}
更好的做法: 扁平化結構或使用引用。
{
"users": {
"alice": { "role": "admin" }
},
"permissions": {
"admin": ["read", "write", "delete"]
}
}
9. 缺少開始或結束括號
錯誤: Expected ',' or '}' 或 Unexpected end of JSON input
不匹配的括號和方括號是常見的 JSON 錯誤來源,尤其是在大型或手寫的 JSON 檔案中。
無效的 JSON:
{
"name": "Alice",
"items": [1, 2, 3
}
修復: 確保每個 { 都有對應的 },每個 [ 都有對應的 ]。
{
"name": "Alice",
"items": [1, 2, 3]
}
專業提示: 正確縮排你的 JSON,以視覺化方式對應開始和結束括號。JSON 格式化工具可以自動完成此操作。
如何有效除錯 JSON 錯誤
- 使用 JSON 驗證器:將你的 JSON 貼到免費的 JSON 驗證器中,取得第一個錯誤的精確行號和列號。
- 逐步驗證:對於大型檔案,一次驗證一個區塊以隔離錯誤。
- 注意複製貼上的產物:不可見字元、智慧引號和不間斷空格經常從文字處理器或網頁中混入。
- 檢查字元編碼:確保你的檔案儲存為 UTF-8。其他編碼可能產生意想不到的錯誤。
- 使用 linter:ESLint 等工具配合
json外掛可以在開發過程中捕捉 JSON 錯誤。
請記住:JSON 解析器通常只報告第一個語法錯誤。修復該錯誤,重新驗證,然後重複此過程直到文件通過。我們的 JSON 格式化與驗證工具為你提供即時、詳細的錯誤訊息,以加速此過程。