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