修復 JSON 中的尾隨逗號

物件最後一個屬性或陣列最後一個項目後面的尾隨逗號,在部分 JavaScript 場景下允許,但在 JSON 中並不合法。

為什麼會出錯

JavaScript 物件字面值常常允許最後一項後面加逗號,但 JSON 要求最後一項後面必須直接接著關閉的中括號或大括號。

錯誤範例

{ "name": "Ada", "active": true, }

修正後的 JSON

{ "name": "Ada", "active": true }

尾隨逗號是哪裡來的

多半是有人手動編輯設定、把最後一項註解掉,或是直接從 JavaScript/TypeScript 程式碼貼過來。模板引擎與程式碼產生器在迴圈裡無腦加逗號,也會產生這種狀況。

為什麼有些解析器接受、JSON 卻不接受

JavaScript 物件字面值、JSON5、JSONC、YAML,以及多數程式語言的字面值語法都允許尾隨逗號,因為這樣 diff 比較乾淨。但 RFC 8259 JSON 故意不允許 —— JSON.parse、Go 的 encoding/json、Python 的 json 模組這類嚴格解析器都會拒絕。

在進入正式環境之前抓到尾隨逗號

在 CI 用嚴格的 JSON 解析器 lint 設定檔(jq、python -m json.tool 或 node -e 'JSON.parse(...)')。在 TypeScript 專案裡,把 Prettier 的 .json 設定設為 "trailingComma": "none",這樣格式化時就不會自動加上去。

尾隨逗號未必就是真正的 bug

如果有尾隨逗號的 payload 來自某個 API 或會輸出 JSON 的程式庫,問題其實是在上游的序列化,不在使用端。本地把逗號修掉只是把產生端的 bug 蓋住,下一次還會出現 —— 改的是輸出端。

FAQ

問:JSON.parse 之後會接受尾隨逗號嗎?答:不會 —— 嚴格模式才是標準。問:JSON5 算不算安全的替代?答:只適合人工編輯的設定檔,千萬別用在傳輸協定上。問:自動修復工具能只去掉尾隨逗號嗎?答:可以,貼上 JSON 它會連同其他常見語法錯誤一併處理。