JSONキーに引用符付き文字列を使用する実用的な理由はありますか?


87

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

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

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

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

JSONを二重引用符で囲んでも意味がありませんか?

有効な例:

{
  "keyName" : 34
}

無効とは対照的に:

{
   keyName : 34
}

20
「なぜそれを正しく行うのが面倒なのですか?」これは、無効なマークアップを積んだWebサイトにつながる、一種の怠惰な思考です。一部のブラウザ二重引用符を必要とする場合に備えて、コードの将来性を保証します。
貧弱

21
「なぜそれを正しく行うのが面倒なのですか?」-実際のメリットがない場合、他の誰もしない規則に従う必要があるのはなぜですか?おそらく、怠惰な思考と実用主義を混同しているのかもしれません。
Mark Rogers、

15
@マーク-「誰もやらないこと」...そのアイデアはどこで得ましたか?すべての主要なプラットフォームに組み込まれいるJSONシリアライザーは適切な引用を行います。
Nick Craver

7
@Mark Rogers PHPのjson_encode関数は、たとえば二重引用符で囲まれた文字列を含む有効なJSONを生成します。JavaScriptでオブジェクトリテラルを考えているのではないでしょうか。キーを引用符で囲まなくても機能することは事実ですが、JSONではありません。
JAL

9
ちなみに、何年か前に私がこれを投稿したとき、@ JALが示唆しているように、JSONとオブジェクトリテラル表記の違いについて混乱していました。2つは非常によく似た構文を持っているため、最終的には問題の説明に混乱が生じます。
Mark Rogers

回答:


155

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.functionES5ではOk)。

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


1
@マーク、どういたしまして。JSONは単に言語にとらわれないデータ交換形式であることを覚えておいてください。その構文がJavaScript Object Literal構文に触発されたとしても、それらの間には違いがあります(引用されたキーだけではありません)。
クリスチャンC.サルバド2010年

2
@CMS、それでなぜそれは二重引用符だけでなければならないのですか?JSONで単一引用符が無効なのはなぜですか?
Pacerier、2014年

1
JSON標準をできるだけ単純にするために、単一引用符は許可されていません。JSONはJavascriptのサブセットである必要があるだけで、できるだけ多くのJavaScriptを実装する必要はありません。
thomasrutter 2017

JSON5はスペックスーパーセット ES5構文に付着し、したがって、とりわけ引用符で囲まれていないキーをサポートしています。ライブラリには互換性parsestringifyメソッドがあります。
イニゴ

その互換性テーブルリンク(回答の下部)で、予約語エントリは、オブジェクト/配列リテラル拡張セクションの下にあります。そしてTL; DR、リストされているすべてのブラウザー(聞いたことがあるすべて、さらに約20)はすべて「はい」と答えます。
i336_

16

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

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

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

これらのすべてが... 引用符で有効で、なぜ一貫性がないと、問題の可能性を排除し、すべてのケースでそれらを使用しますか?

Web開発者の世界でのもう1つの一般的な例:ほとんどのブラウザーでレンダリングされる無効なHTMLの例は何千もあります...デバッグまたは維持するのにそれほど苦痛を与えませんか?まったく、まったく逆です。

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


はい、私は古いajaxアプリがschonky jsonサーバーサイドを生成していたのですが、jquery 1.4にアップグレードすると、キー名の前後に二重引用符がないために失敗しました。
JAL

すべての主要なブラウザJSON.parseも正しく拒否することを追加したい場合があります。
Matthew Flaschen、2010年

私は好奇心が強いのですが、JQuery 1.4はこのタイプの無効なjsonで静かに失敗しますか?
Mark Rogers、

1
@マーク-いずれの場合も、適切に引用符で囲まれていないか、無効な文字が含まれています...基本的に、無効なJSONで失敗します。
Nick Craver

興味深いことに、これはJQuery 1.4での私の経験ではありません。さらに、jqueryがjsonオブジェクトの作成を担当するとは思わない。ブラウザのjavascriptインタープリタが行うことではないのか?Jquery jsonの逆シリアル化を参照していますか?
Mark Rogers、

-3

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

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

JSを含む、太陽の下のすべての言語用のライブラリがあります。例:https : //github.com/nodeca/js-yaml


10
YAMLはJSONのスーパーセットではありません。
ジョンギブ2014

理由については、stackoverflow.com
Ben Page
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.