2012-04-09 27 views
30

this jsfiddleで示されているように、JSファイルを使用してJSONオブジェクトを作成すると、キー(メンバー)がラップされているかどうかによって動作が異なります引用符で囲むかどうか。jsの奇妙なJSON解析動作 "予期しないトークン"

有効なコード:{ a: 1};
無効コード:{ "a": 1 };

あなたが得る何がエラーメッセージです(FF/IEのために異なるChromeで、まだ構文に失敗する)

Uncaught SyntaxError: Unexpected token :

が、何らかの方法でオブジェクトを使用している場合は、たとえばalert({ "a": 1 });はすべてOKです。

どうしてですか?

答えて

53

声明:

{ a: 1 }; 

オブジェクトリテラルではありません。 1つのラベル付き表現を含むブロック文です。それは有効です。

この:それだけで解析可能ではないので

{ "a": 1 }; 

は構文エラーです。引用符で囲まれた "a"はブロック内の式文を開始しますが、文字列の後の次のトークンはコロンで、式のようにコロンが続く式はありません。今

:「{」ブロック文の開始として解釈されていないため

var x = { "a": 1 }; 

作品。その文はvarで始まるので、変数宣言です。 "="トークンの右側の式の中で、 "{"が意味することができるのは、オブジェクトリテラルの開始点だけです。同様に、次の点に注意してください左括弧がパーサは、ネストされた部分式を期待していますので、

({ "a": 1 }); 

はOKですので、再び「{」は明確にそれはオブジェクトリテラルのスタートだということを意味します。

+0

varに割り当てるとオブジェクトリテラルになりますか? – karnyj

+0

あいまいさがないので、はい。 – Pointy

+5

javascriptの内部は本当に何かです:)ありがとう – karnyj

2

このエラーは、jsonpを使用してjQuery AJAXコールを実行すると、jsonpが不要な場合にポップアップ表示されます。これは私がちょうどrequire経由でJSONを読み込むと、ファイル名が、私はこのエラーを取得.jsonに終わらない場合よりも実現し、通常のjson

$.ajax({ 
    dataType: 'json', // try using json rather than json p 
    ... 
}); 
0

にする場合であれば、あなたのAJAX呼び出しにあなたのデータの種類を切り替えてみてください。ファイルの名前をbla.jsonに変更しても問題ありません。

関連する問題