JSON の引用符なしキーを修正

name、active、profile のようなキーであっても、見た目は普通の識別子でも、有効な JSON では必ず引用符で囲む必要があります。

なぜ無引用キーは失敗するのか

JavaScript はオブジェクトリテラル内の素のプロパティ名を許容します。JSON は許容しません;あらゆるオブジェクトのキーはダブルクォートで囲まれた文字列でなければなりません。

エラーの例

{ name: "Ada", active: true }

修正後の JSON

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

JavaScript の識別子が JSON のキーに見える理由

JavaScript のオブジェクトリテラルでは、name が有効な識別子なので { name: "Ada" } は合法です。JSON はそのショートカットを外し、パーサがすべてのキーについて 1 つの形 —— 引用符付き文字列 —— だけを認識すれば済むようにしました。これで文法はどの言語でも実装できるくらい小さく保てます。

常に引用符が必要なキー

仮にパーサが素の識別子を許容したとしても、いくつかのキー形は引用符が必要です:return や class のような予約語、ハイフンやドットを含む名前、数字で始まる名前、結合文字や絵文字を含む Unicode 名などです。すべてのキーを引用符で囲めば、こうしたエッジケースをまとめて回避できます。

自動修復が安全に裸キーを引用符付きにできる条件

修復ツールはキー位置に現れた裸の識別子 —— つまり { または , の直後で、後ろに : が続くもの —— にだけ引用符を付けます。すでに引用符付きのキー、値、文字列内のテキストには触れないので、有効なキーと無効なキーが混在していても安全です。

JSON5 と JSONC

JSON5 と JSONC(VS Code の設定で使われる形式)はどちらも無引用キーやコメントを許容します。人が編集する設定には良いですが、データ交換には不向きです —— 標準クライアントは拒否するので、JSON5 を API 越しに出してはいけません。

FAQ

Q:なぜ JSON に無引用キーがあるのか? A:たいていは JavaScript のオブジェクトリテラルからコピーされたか、テンプレートエンジンが引用符を付け忘れたかです。Q:package.json では無引用のままで良いですか? A:いいえ。package.json は厳格な JSON です。許されるのは tsconfig.json(JSONC)だけです。