JSON vs JSON5 vs JSONC
要点:厳密な上位集合の順序:JSONC はコメントを追加し、JSON5 は単一引用符、引用符なしキー、末尾カンマ、16 進数を追加します。選び方を誤るとエディタではなく API が壊れます。

要点:データがシステム境界を越えるときは常に標準 JSON を使い、人間が編集するローカル設定にだけ JSONC を使いましょう。単一引用符、末尾カンマ、引用符なしキーが必要なら JSON5 に手を伸ばしますが、まず読み込み側が対応していることを確認してください。
一行で言うと:JSONC は JSON にコメントを足したもの、JSON5 は JSON に JavaScript の習慣を足したものです。
機能マトリクス
| 機能 | JSON | JSONC | JSON5 |
|---|---|---|---|
| 二重引用符の文字列 | ✅ | ✅ | ✅ |
| 単一引用符の文字列 | ❌ | ❌ | ✅ |
| 引用符なしキー | ❌ | ❌ | ✅ |
// 行コメント |
❌ | ✅ | ✅ |
/* */ ブロックコメント |
❌ | ✅ | ✅ |
| 末尾カンマ | ❌ | ❌ | ✅ |
16 進数 0xFF |
❌ | ❌ | ✅ |
Infinity / NaN |
❌ | ❌ | ✅ |
| 複数行文字列 | ❌ | ❌ | ✅ |
| 標準パーサーで読める | ✅ | ❌ | ❌ |
JSONC が解決するのはコメントだけです。多くの人は「コメントを許す JSON」が末尾カンマも許すと思い込みますが、tsconfig.json は末尾カンマで依然失敗します。
それぞれの用途
JSON — 交換。API、キュー、データベースの JSON 列、ログ。機械同士のすべて。
JSONC — エディタ設定。VS Code がこれらのファイルを自分でパースするので、JSON.parse がそれらを見ることはありません。RFC はなく、Microsoft 主導の事実上の慣習です。
JSON5 — 人間向けの寛容な上位集合。目標は「JavaScript のオブジェクトリテラルに見える設定」でした。ビルドツールが読み込む .json5 ファイルに最適で、最も広い構文と最も狭いツール対応を持ちます。
選択
| 状況 | 選ぶもの |
|---|---|
| リクエスト / レスポンスボディ | JSON。代替なし |
| MySQL / PostgreSQL の JSON 列 | JSON。その関数は他を受け付けない |
| 説明が必要なプロジェクト設定 | 対応していれば JSONC、なければ YAML |
| JS 風の緩さが欲しい | 読み込み側の対応を確認したうえで JSON5 |
| 非エンジニアが編集する | YAML。波括弧よりインデント |
一つの簡単な罠
JSONC ファイルを厳格な JSON としてパースすると、コメントを指すエラーが生まれます。
SyntaxError: Unexpected token / in JSON at position 42
コメントを削除する前に、そのファイルが JSONC であるべきか確認してください。削除しても二行後に末尾カンマで失敗するかもしれません。
FAQ
JSONC と JSON5 はどう選べばよいですか?
必要なのがコメントだけなら JSONC を使います。JSON に // と /* */ を足すだけで、VS Code の settings.json と tsconfig.json が使っています。単一引用符、引用符なしキー、末尾カンマ、16 進数、複数行文字列も欲しいなら JSON5 を使います。どちらも読み込み側に依存するので、ファイルを読むツールが対応していることを確認してください。
JSONC ファイルを標準 JSON として読めないのはなぜですか?
JSONC は事実上の慣習で、独立した RFC ではないので、標準パーサーはコメントを拒否します。そのようなファイルに JSON.parse を使うと Unexpected token / を投げ、データではなくコメントを指します。エディタか専用パーサーが読む設定だけを JSONC で書くべきです。
JSON5 ファイルを API に送るべきですか?
いいえ。API、データベースの JSON 列、キューは厳格な JSON をパースするので、JSON5 の単一引用符、引用符なしキー、末尾カンマは拒否されます。JSON5 は人間が編集するローカル設定用で、システム境界を越える前に標準 JSON に変換してください。