JSON 解析錯誤最常見的原因,以及如何修正
大多數 JSON 解析錯誤都來自幾種常見的錯誤:多餘的逗號、單引號字串、註解、沒有引號的鍵、像 NaN 或 undefined 這類的值,或是從文件複製來的彎引號。JSON 比它所類似的 JavaScript 嚴格,所以人眼看起來沒問題的程式碼,解析器可能會拒絕。錯誤訊息會指出行與欄的位置,而修正方法通常就在該位置或其前一個字元。
格式化 JSONJSON 無法解析免費使用JSON 強制執行的規則
一份 JSON 文件就是一個值:大括號包住的物件、中括號包住的陣列、字串、數字、true、false 或 null。在這些值之中:
- 每個鍵和每個字串都使用直引號(雙引號),例如 "name"。
- 逗號用來分隔項目,物件或陣列的最後一個項目後面不能有逗號。
- 數字不能有前置的加號;NaN、Infinity 和 undefined 都不是有效的數字或值。
- 完全不允許註解。
- 鍵必須是字串,所以沒有引號的鍵,例如 name:,是無效的。
有些解析器預設會接受其中幾項,有些工具為了方便也會接受含註解的 JSON。這種寬鬆會把問題隱藏起來,直到檔案交給更嚴格的讀取程式才爆發,所以請直接寫嚴格的格式。
讀懂錯誤訊息
解析器會回報它第一個無法繼續的地方。訊息會說明問題,並給出位置,通常是行和欄。以下是一個小檔案,陣列中有一個多餘的逗號,最後一個屬性後面又有一個:
{
"name": "Ada",
"tags": ["a", "b",],
}
Python 會回報:"Illegal trailing comma before end of array: line 3 column 20"。不同工具的措辭不一樣,有些較舊的解析器只會顯示 "Unexpected token" 加上字元位移。請前往回報的位置,然後看該位置前一個字元。真正的錯誤常常是在回報位置的前一兩個字元,可能是逗號、引號或大括號。
以下是 Python 解析器的其他幾則訊息,以及它們通常代表的意思:
- 對於 '{'a': 1}',"Expecting property name enclosed in double quotes" 表示使用了單引號或沒有引號的鍵。
- 在你預期數字或字串的位置出現 "Expecting value",通常是彎引號造成的,因為解析器把它當成無法辨識的字元。
- "Expecting ',' delimiter" 通常代表兩個項目之間缺少逗號,或資料中間有註解。
彎引號與複製來的文字
彎引號是最容易讓人混淆的情況,因為它們看起來幾乎和直引號一樣。從文書處理軟體、網頁或聊天訊息複製來的 JSON 檔案,可能含有彎的雙引號。檔案在你眼中看起來正確,但解析失敗,因為解析器把 “x” 當成無法辨識的字元,而不是字串的界定符號。
隱藏字元也會造成同樣的失敗。兩個值之間的不換行空白,對解析器來說不是空白。在你手動修正結構之前,請先移除隱藏字元,接著再修正引號。彎引號指南說明如何安全地把它們改成直引號。
單引號、註解與沒有引號的鍵
許多開發者會用允許較寬鬆語法的語言撰寫類似 JSON 的資料:
- 單引號在 JavaScript 和 Python 的字面值中是有效的,但 JSON 要求雙引號。請把 {'a': 1} 改成 {"a": 1}。
- 必須移除
//或/* */這類註解。若需要備註,請把它們放在獨立的欄位中,或改用為設定檔設計的格式。 - 沒有引號的鍵在 JavaScript 物件字面值中很常見,請加上引號。
- NaN 和 undefined 不是 JSON。遺漏的值請用 null 表示,若值是文字則改用字串。
全面取代要小心。把每個單引號都改成雙引號,會破壞所有含撇號的字串,例如 "Ada's notes"。請先在尋找與取代中預覽每個符合項目,確認哪些引號會被更改。
逐步修正結構
- 把檔案貼到 JSON 格式化工具。格式化會讓結構清楚顯示,錯誤也會標示行與欄。接著按下修復,它會移除註解和多餘的逗號。它不會更改單引號或彎引號,所以這些請自行修正。
- 一次只修正第一個錯誤,然後重新檢查。一個錯誤可能會在後面產生好幾個錯誤。
- 確認每個開始的大括號或中括號都有對應的結束符號,且巢狀結構符合你的意圖。
- 用你的應用程式所使用的解析器來驗證最終檔案,不要只用網頁工具。不同解析器的細節略有差異。
能解析的檔案不一定就是你想要的檔案。依 JSON Schema 進行檢查,可以找出缺少的欄位或型別錯誤的值;或是比較兩份 JSON 文件,看看版本之間改了什麼。
特殊情況
- 產生檔案中的多餘逗號。 有些工具會寫出它們。如果你是用字串手動組出 JSON,請使用你所用語言的序列化功能,它會寫出有效的輸出。
- 重複的鍵。 JSON 允許重複的鍵,但大多數解析器只會保留最後一個值。重複的鍵是潛在的錯誤來源。
- 大數字。 某些解析器對非常大的整數可能會失去精確度,所以如果識別碼長到解析器無法精確表示,請把它存成字串。CSV 轉 JSON 指南在談到 ID 時也提到了同樣的重點。
快速解答
為什麼我的 JSON 看起來正確卻會失敗?
常見原因是多餘的逗號、單引號、註解,或從文件複製來的彎引號。請檢查錯誤訊息中的位置,以及該位置前一個字元。
JSON 可以有註解嗎?
不行。JSON 標準不允許註解。請移除它們,或把備註移到獨立的欄位中。格式化工具的修復按鈕會替你移除這些註解。
在 JSON 中,undefined 應該改用什麼?
當某個值是刻意缺少時,使用 null,或直接省略該鍵。undefined 是 JavaScript 的值,在 JSON 中沒有對應的表示方式。
借助 AI 協助,由英文原文翻譯而成。
留言
還沒有留言,搶先留言吧。


