JSONキーを引用符で囲む必要がある本当の理由は、ECMAScript3の識別子のセマンティクスに依存しています。
予約語は、引用符なしでオブジェクトリテラルのプロパティ名として使用することはできません。次に例を示します。
({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
引用符を使用する場合、プロパティ名は有効です。
({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok
自身のCrockfordがこの講演でそれを説明しています。彼らは、JSON標準をシンプルに保ちたいと考えていました。そして、それらすべてのセマンティック制限を持たせたくありませんでした。
...。
引用符で囲まれていない名前の問題を発見したのはそのときでした。ECMAScript3には予約語ポリシーがあります。予約語は重要な位置で引用する必要があり、これは本当に厄介です。これを標準に定式化することに取り掛かったとき、それは本当にばかげているように見えるので、私はすべての予約語を標準に入れる必要はありませんでした。
当時、私は人々を説得しようとしていました。ええ、JavaScriptでアプリケーションを書くことができます。それは実際に機能し、優れた言語です。それで、私は同時に言いたくありませんでした:そして、彼らがしたこの本当に愚かなことを見てください!そこで、代わりに、キーを引用することにしました。
そうすれば、それがどれほど強打されているかを誰かに話す必要はありません。
そのため、今日まで、キーはJSONで引用されています。
..。
ECMAScript 5th Edition Standardはこれを修正し、現在ES5実装では、オブジェクトリテラルとメンバーアクセスの両方で、予約語でさえ引用符なしで使用できます(obj.functionES5ではOK)。
念のため、この標準は最近ソフトウェアベンダーによって実装されています。この互換性テーブルで、この機能がどのブラウザに含まれているかを確認できます(プロパティ名としての予約語を参照) 。