2012-04-09 13 views
30

Wie in this jsfiddle gezeigt, wenn Sie eine JS-Datei haben und Sie erstellen ein JSON-Objekt ohne es zu verwenden, verhält es sich je nachdem, ob die Schlüssel (Mitglieder) eingewickelt sind Zitate oder nicht.Weird JSON Parsing Verhalten in js, "Unerwartete Token:"

gültige Code: { a: 1};
ungültiger Code: { "a": 1 };

Was Sie erhalten eine Fehlermeldung (in Chrome, unterschiedlich für FF/IE, aber immer noch nicht auf Syntax)

Uncaught SyntaxError: Unexpected token :

aber Wenn Sie das Objekt in irgendeiner Weise verwenden, zum Beispiel: alert({ "a": 1 }); ist alles wieder in Ordnung.

Warum passiert das?

Antwort

53

Die Aussage:

{ a: 1 }; 

ist nicht ein Objektliteral. Es ist eine Block-Anweisung mit einem markierten Ausdruck darin. Es ist gültig.

Dies:

{ "a": 1 }; 

ist ein Syntaxfehler, weil es einfach nicht parseable ist. Das in Anführungszeichen gesetzte "a" startet eine Ausdrucksanweisung innerhalb des Blocks, aber dann ist das nächste Token nach dem String ein Doppelpunkt und es gibt kein Ausdrucksformular, das wie ein Ausdruck aussieht, gefolgt von einem Doppelpunkt.

Jetzt:

var x = { "a": 1 }; 

funktioniert, weil die „{“ nicht als Beginn einer Blockanweisung interpretiert. Diese Anweisung beginnt mit var, also ist es eine Variablendeklaration. Innerhalb des Ausdrucks auf der rechten Seite des Tokens "=" ist das einzige, was ein "{" bedeuten kann, der Beginn eines Objektliterals. Ebenso ist zu beachten, dass:

({ "a": 1 }); 

OK ist, da die öffnende Klammer macht der Parser eine verschachtelte subexpression erwarten, also wieder die „{“ bedeutet eindeutig, dass es der Beginn eines Objektliteral ist.

+0

aber die Zuordnung zu einer var macht es zu einem Objektliteral? – karnyj

+0

Ja, weil es keine Zweideutigkeit gibt. – Pointy

+5

Javascript Interna sind wirklich etwas :) danke – karnyj

2

Dieser Fehler kann auftreten, wenn ein jQuery AJAX-Aufruf mit jsonp ausgeführt wird, wenn jsonp nicht erforderlich ist. Versuchen Sie, Ihren Datentyp auf AJAX-Aufruf Umschalten, wenn dies der Fall in der normalen json ist

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

ich nur realisiert werden, als wenn die JSON über require Laden und der Dateiname endet nicht auf .json ich diesen Fehler. Umbenennen der Datei zu bla.json und es funktioniert gut.