web-dev-qa-db-ja.com

プロパティ名のJSON構文

大多数のWebブラウザで機能するJavaScriptでオブジェクトを作成するための正しい構文は何ですか(つまり、IE 6 +、Firefox 2 +、Opera 9+)

これは有効ですか


var a={ "class": "Person", 
        "name": "William Shakespeare",
        "birthday": -12802392000000, 
        "nickname": "Bill" 
       } ;

またはこれは:


var a={ class: "Person", 
        name: "William Shakespeare",
        birthday: -12802392000000, 
        nickname: "Bill" 
       } ;

そして、2つの違いは何ですか?

28
Nikola Stjelja

@ AndreasNは正しいJSON仕様 実際にJSONになるために引用符を使用するように指示します。引用符を使用しない場合、Javascriptでは有効なオブジェクトリテラルである可能性がありますが、JSONではありません。ブラウザ側のJavascript以外の他のサービスはJSONを使用し(たとえば、php、Javaなどを使用するWebサービス)、引用符のない文字列を作成した場合、正しく解析される保証はありません-ほとんどの実装はそうするのに十分堅牢です。

参考までに、Javascriptでは、悪意のある攻撃を防ぐことができないソースからのJSON文字列にeval()を直接使用することは危険です。繰り返しになりますが、 JSONサイト を参照してください。これには、JSON文字列をJavascriptオブジェクトに安全に解析する非常に短いjavascriptファイルと同様に詳細が記載されています。

編集:技術的には、元の質問はJSONに関するものではなく、オブジェクトリテラルに対するJavascriptの構文に関するものだと思います。違いは、JSON文字列から構築可能なオブジェクトは、他の多くの可能なオブジェクトリテラルを除外することです。

var a = {cat: "meow", dog: "woof"};
var aname = {cat: "Garfield", dog: "Odie"};
var b = {
  counter: 0,
  pow: function(x) { return x+1; },
  zap: function(y) { return (counter += y); }
};
var c = {
  all: [a,aname],
  animals: a,
  names: aname,
};

オブジェクトリテラル「a」と「aname」は、JSONで表現できます(プロパティ名に引用符を追加することにより)。しかし、オブジェクトリテラル「b」と「c」はできません。オブジェクトリテラル「b」には関数が含まれています(JSONでは許可されていません)。上記のオブジェクトリテラル「c」には、一部の参照が共有されているため、JSONでは表現できない方法で他の変数への参照が含まれています。 c.namesに変更を加えると、同じ変数への参照を共有するため、c.all[1]も変更されます。 JSONは、ツリー構造を持つオブジェクトのみを表現できます(たとえば、オブジェクト全体の各サブ要素は独立しています)。

31
Jason S

IEが2番目の例で失敗した場合、「クラス」は予約語であるためです(IEのみ)。一般的に言えば、プロパティ名を引用符で囲むのが常に最善です。これを行うと、常にどんな状況でも仕事。

8
James

spec 「」を使用すると言います。

Firefoxはなしで受け入れますが、IEは受け入れません。

ペアは次のように定義されます

string : value

値は文字列にすることができます文字列は次のように定義されます

" chars "
7
AndreasN

Word文字以外のものを含むプロパティを囲む「引用符」を使用する必要があります

{foo-bar: 3} // invalid
{"foo-bar": 3} // valid

それ以外は2つの間に違いはなく、すべてのブラウザで両方の方法が機能すると思います

5
Gareth