Crockfordの json.org によると、JSONobjectはmembers、これはpairsで構成されています。
すべてのペアは、stringとvalueで構成され、stringは次のように定義されます:
文字列は、バックスラッシュエスケープを使用して、二重引用符で囲まれた0個以上のUnicode文字のシーケンスです。文字は、単一の文字列として表されます。文字列は、CまたはJava文字列に非常によく似ています。
しかし実際には、ほとんどのプログラマーは二重引用符を使用する必要がないため、ほとんどのプログラマーはJSONキーを二重引用符で囲む必要があることすら知りません。
JSONを二重引用符で囲むのは面倒でしょうか?
有効な例:
{
"keyName" : 34
}
無効とは対照的に:
{
keyName : 34
}
JSONキーを引用符で囲む理由についての本当の理由は、ECMAScript 3の識別子のセマンティクスに依存しています。
予約語 は、引用符なしのオブジェクトリテラルでは、プロパティ名として使用できません。例:
({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
一方、引用符を使用する場合、プロパティ名は有効です。
({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok
自身のCrockfordが this talk で説明しているため、JSON標準をシンプルに保ちたいと考えており、これらのセマンティック制限をすべて持ちたくないのです。
....
それが、引用されていない名前の問題を発見したときです。 ECMA Script 3には予約済みのWordポリシーがあります。予約語はキー位置で引用する必要がありますが、これは本当に面倒です。これを標準に定式化することになったとき、予約語をすべて標準に含める必要はありませんでした。
当時、私は人々を納得させようとしていました。ええ、JavaScriptでアプリケーションを書くことができます。実際に動作し、優れた言語です。同時に、私は言いたくありませんでした:彼らがしたこの本当に愚かなことを見てください!そこで、代わりに、キーを引用することにしました。
そのようにして、私たちはそれがどのように強打されているかについて誰にも話す必要はありません。そのため、今日まで、キーはJSONで引用されています。
...
ECMAScript 5th Edition Standardはこれを修正し、現在ES5実装で、オブジェクトリテラルとメンバーアクセス(obj.function
Ok)。
記録のために、この標準は最近ソフトウェアベンダーによって実装されています。このブラウザには、この機能が含まれているブラウザを確認できます 互換性テーブル (名前)
はい、それは無効なJSONであり、そうでない場合は多くの場合拒否されます。たとえば、jQuery 1.4+には、引用符で囲まれていないJSONをサイレントに失敗させるチェックがあります。なぜnotに準拠していないのですか?
別の例を見てみましょう。
_{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }
_
...これらのすべては引用符で有効です、なぜ一貫性がなく、すべての場合にそれらを使用して、問題の可能性を排除しますか?
Web開発者の世界でのもう1つの一般的な例:ほとんどのブラウザーでレンダリングされる無効なHTMLの例は何千もあります...デバッグや保守が簡単になりますか?まったく逆ではありません。
また、@ Matthew は以下のコメントですべての最も良い点を示します。このalreadyは失敗し、引用符のないキーは JSON.parse()
すべての主要なブラウザ(およびそれを正しく実装する他のブラウザ)、 ここでテストできます 。