93

Crockfordのjson.orgによると、JSONオブジェクトメンバーで構成されており、メンバーはペアで構成されています。

すべてのペアは文字列で構成され、文字列は次のように定義されます。

文字列は、バックスラッシュエスケープを使用して、二重引用符で囲まれた0個以上のUnicode文字のシーケンスです。文字は単一の文字列として表されます。文字列は、CまたはJavaの文字列に非常によく似ています。

しかし実際には、ほとんどのブラウザーは二重引用符を使用する必要がないため、ほとんどのプログラマーはJSONキーを二重引用符で囲む必要があることさえ知りません。

JSONを二重引用符で囲むのは意味がありますか?

有効な例:

{
  "keyName" : 34
}

無効とは対照的に:

{
   keyName : 34
}
4

4 に答える 4

161

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)。

念のため、この標準は最近ソフトウェアベンダーによって実装されています。この互換性テーブルで、この機能がどのブラウザに含まれているかを確認できます(プロパティ名としての予約語を参照) 。

于 2010-11-17T04:54:13.173 に答える
17

はい、それは無効なJSONであり、そうでない場合は多くの場合拒否されます。たとえば、jQuery 1.4+には、引用符で囲まれていないJSONをサイレントに失敗させるチェックがあります。なぜ準拠しないのですか?

別の例を見てみましょう:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

...これらすべて引用符で有効ですが、一貫性を保ち、すべての場合に使用して、問題の可能性を排除してはどうでしょうか。

Web開発者の世界でのもう1つの一般的な例:ほとんどのブラウザーでレンダリングされる無効なHTMLの例は何千もあります...それにより、デバッグや保守の負担が軽減されますか?まったく逆です。

また、@ Matthewは、以下のコメントですべての最良の点を示しています。これはすでにJSON.parse()失敗しています。引用符で囲まれていないキーは、すべての主要なブラウザー(およびそれを正しく実装する他のブラウザー)で構文エラーをスローします。ここでテストできます

于 2010-11-17T04:18:11.943 に答える
0

私が標準を正しく理解していれば、JSONが「オブジェクト」と呼ぶものは、通常の意味での実際のオブジェクトよりも実際にはマップ(「辞書」)にはるかに近いものです。現在の規格は、あらゆるタイプのキーを許可する拡張機能に簡単に対応し、

{
    "1" : 31.0,
      1 : 17,
     1n : "valueForBigInt1"
}

3つの異なる要素の有効な「オブジェクト/マップ」。

この理由がなければ、設計者はすべての場合(おそらくキーワードを除く)でキーの周りの引用符をオプションにしたと思います。

于 2021-10-25T19:48:07.473 に答える
-4

実際にはJSONのスーパーセットであるYAMLは、あなたがやりたいことをサポートします。スーパーセットですが、必要なだけシンプルに保つことができます。

YAMLは新鮮な空気の息吹であり、それを見る価値があるかもしれません。開始するのに最適な場所はここです:http://en.wikipedia.org/wiki/YAML

JSを含むすべての言語のライブラリがあります(例:https ://github.com/nodeca/js-yaml)

于 2013-08-26T00:52:58.480 に答える