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 パーサ(jq、python -m json.tool、node -e 'JSON.parse(...)' など)を使って設定ファイルを lint してください。TypeScript リポジトリでは、.json に対する Prettier の "trailingComma" を "none" に設定し、フォーマッタが末尾カンマを挿入しないようにしてください。

末尾カンマが本当のバグでないとき

API や JSON を生成するライブラリから来た payload に末尾カンマが含まれている場合、問題は上流のシリアライズにあります。ローカルで直すと生成側のバグを隠してしまい、次の呼び出しでまた現れます —— 生成側を直してください。

FAQ

Q:JSON.parse は今後末尾カンマを受け入れますか? A:いいえ、strict モードが標準です。Q:JSON5 は安全な代替ですか? A:人が編集する設定向けには良いですが、通信プロトコルでは使わないでください。Q:自動修復ツールは末尾カンマだけを取り除けますか? A:はい。JSON を貼り付ければ、よくある他の構文エラーと合わせて取り除いてくれます。