Die Techniken "eval ()" und "JSON.parse ()" verwenden sich gegenseitig ausschließende Formate.
- Bei "eval ()" sind Klammern erforderlich .
- Mit "JSON.parse ()" sind Klammern verboten .
Achtung, es gibt "stringify ()" - Funktionen, die das "eval" -Format erzeugen. Für Ajax sollten Sie nur das JSON-Format verwenden.
Während "eval" die gesamte JavaScript-Sprache enthält, verwendet JSON nur eine winzige Teilmenge der Sprache. Zu den Konstrukten in der JavaScript-Sprache, die "eval" erkennen muss, gehört die "Block-Anweisung" (auch bekannt als "zusammengesetzte Anweisung") . Dies ist ein Paar oder geschweifte Klammern "{}" mit einigen Anweisungen im Inneren. Geschweifte Klammern werden aber auch in der Syntax von Objektliteralen verwendet. Die Interpretation unterscheidet sich durch den Kontext, in dem der Code erscheint. Etwas mag für Sie wie ein Objektliteral aussehen, aber "eval" sieht es als zusammengesetzte Aussage.
In der JavaScript-Sprache treten Objektliterale rechts von einer Zuweisung auf.
var myObj = { ...some..code..here... };
Objektliterale treten nicht alleine auf.
{ ...some..code..here... } // this looks like a compound statement
Als er auf die ursprüngliche Frage des OP zurückging, die 2008 gestellt wurde, fragte er, warum in "eval ()" Folgendes fehlschlägt:
{ title: "One", key: "1" }
Die Antwort ist, dass es wie eine zusammengesetzte Aussage aussieht. Um es in ein Objekt zu konvertieren, müssen Sie es in einen Kontext stellen, in dem eine zusammengesetzte Anweisung nicht möglich ist. Dies geschieht durch Klammern
( { title: "One", key: "1" } ) // not a compound statment, so must be object literal
Die OP fragte auch , warum eine ähnliche Aussage tat erfolgreich eval:
[ { title: "One", key: "1" }, { title: "Two", key: "2" } ]
Die gleiche Antwort gilt - die geschweiften Klammern befinden sich in einem Kontext, in dem eine zusammengesetzte Aussage unmöglich ist. Dies ist ein Array-Kontext " [...]
", und Arrays können Objekte enthalten, aber keine Anweisungen.
Im Gegensatz zu "eval ()" sind die Funktionen von JSON sehr eingeschränkt. Die Einschränkung ist beabsichtigt. Der Designer von JSON beabsichtigte eine minimalistische Teilmenge von JavaScript, wobei nur die Syntax verwendet wurde, die auf der rechten Seite einer Zuweisung angezeigt werden konnte. Wenn Sie also Code haben, der in JSON korrekt analysiert wird ...
var myVar = JSON.parse("...some...code...here...");
... das bedeutet, dass es auch auf der rechten Seite eines Auftrags wie diesem legal analysiert wird.
var myVar = ...some..code..here... ;
Dies ist jedoch nicht die einzige Einschränkung für JSON. Die BNF-Sprachspezifikation für JSON ist sehr einfach. Beispielsweise ist die Verwendung von einfachen Anführungszeichen zur Angabe von Zeichenfolgen nicht zulässig (wie dies bei JavaScript und Perl der Fall ist), und es ist nicht möglich, ein einzelnes Zeichen als Byte auszudrücken (wie dies bei 'C' der Fall ist). Leider sind auch keine Kommentare zulässig (was beim Erstellen von Konfigurationsdateien sehr hilfreich wäre). Der Vorteil all dieser Einschränkungen ist, dass das Parsen von JSON schnell ist und keine Möglichkeit zur Code-Injection bietet (eine Sicherheitsbedrohung).
Aufgrund dieser Einschränkungen kann JSON keine Klammern verwenden. Folglich ist eine Klammer in einer JSON-Zeichenfolge ein unzulässiges Zeichen.
Verwenden Sie aus folgenden Gründen immer das JSON-Format mit Ajax:
- Eine typische Ajax-Pipeline wird für JSON konfiguriert.
- Die Verwendung von "eval ()" wird als Sicherheitsrisiko kritisiert.
Betrachten Sie als Beispiel für eine Ajax-Pipeline ein Programm, an dem ein Knotenserver und ein jQuery-Client beteiligt sind. Das Client-Programm verwendet einen jQuery-Aufruf mit dem Formular $.ajax({dataType:'json',...etc.});
. JQuery erstellt ein jqXHR-Objekt zur späteren Verwendung, verpackt und sendet die zugehörige Anforderung. Der Server akzeptiert die Anforderung, verarbeitet sie und ist dann bereit zu antworten. Das Serverprogramm ruft die Methode res.json(data)
zum Packen und Senden der Antwort auf. Zurück auf der Clientseite akzeptiert jQuery die Antwort, konsultiert das zugehörige jqXHR-Objekt und verarbeitet die JSON-formatierten Daten. Dies alles funktioniert ohne manuelle Datenkonvertierung. Die Antwort beinhaltet keinen expliziten Aufruf von JSON.stringify () auf dem Knotenserver und keinen expliziten Aufruf von JSON.parse () auf dem Client. das ist alles für dich erledigt.
Die Verwendung von "eval" ist mit Sicherheitsrisiken für die Code-Injektion verbunden. Sie könnten denken, dass es keinen Weg gibt, der passieren kann, aber Hacker können ziemlich kreativ werden. Außerdem ist "eval" für die Javascript-Optimierung problematisch.
Wenn Sie eine "stringify ()" - Funktion verwenden, beachten Sie, dass einige Funktionen mit diesem Namen Zeichenfolgen erstellen, die mit "eval" und nicht mit JSON kompatibel sind. In Node erhalten Sie beispielsweise die folgende Funktion, mit der Zeichenfolgen im "eval" -kompatiblen Format erstellt werden:
var stringify = require('node-stringify'); // generates eval() format
Dies kann nützlich sein, aber wenn Sie keinen bestimmten Bedarf haben, ist es wahrscheinlich nicht das, was Sie wollen.