Heim >Web-Frontend >js-Tutorial >Ein kleines Problem beim Parsen von JSON-Strings durch Eval in JS_javascript-Kenntnissen
Ich habe bereits einen Einführungsartikel über JSON geschrieben, in dem es um das Parsen von JSON ging. Wir alle wissen, dass fortgeschrittene Browser die JSON.parse()-API verwenden können, um einen JSON-String in JSON-Daten zu analysieren. Für einen etwas weniger geeigneten Ansatz können wir die Funktion eval() verwenden.
JSON (JavaScript Object Notation) ist ein einfaches Datenformat, das leichter als XML ist. JSON ist ein natives JavaScript-Format, was bedeutet, dass für die Verarbeitung von JSON-Daten in JavaScript keine spezielle API oder ein spezielles Toolkit erforderlich ist.
Die Regeln von JSON sind einfach: Ein Objekt ist eine ungeordnete Sammlung von „Name/Wert-Paaren“. Ein Objekt beginnt mit „{“ (linke Klammer) und endet mit „}“ (rechte Klammer). Auf jeden „Namen“ folgt ein „:“ (Doppelpunkt); „‚Name/Wert‘-Paare“ werden durch „“, (Komma)
getrenntvar str = '{"name": "hanzichi", "age": 10}'; var obj = eval('(' + str + ')'); console.log(obj); // Object {name: "hanzichi", age: 10}
Ist Ihnen aufgefallen, dass bei der Übergabe von Parametern an eval() die str-Variable in Klammern gesetzt wird? Warum das tun?
Schauen wir uns zunächst die Definition und Verwendung der Auswertungsfunktion an.
Der Parameter von eval() ist ein String. Wenn die Zeichenfolge einen Ausdruck darstellt, wertet eval() den Ausdruck aus. Wenn das Argument eine oder mehrere JavaScript-Deklarationen darstellt, führt eval() die Deklarationen aus. Rufen Sie eval() nicht auf, um arithmetische Ausdrücke auszuwerten; JavaScript wertet arithmetische Ausdrücke automatisch aus.
Einfach ausgedrückt ist der Parameter der Auswertungsfunktion ein String. Wenn der String „noString“ ist, ist das Ergebnis eine normale JavaScript-Anweisung, die ausgeführt werden kann.
Wie sagt man? Zum Beispiel der folgende Code:
var str = "alert('hello world')"; eval(str);
„Hallo Welt“ erscheint nach der Ausführung. Wir wandeln die str-Variable in „noString“ um. Ein grober Ansatz besteht darin, die äußeren Anführungszeichen zu entfernen und interne Anpassungen (Escape usw.) vorzunehmen, und dann wird daraus:
alert('hello world')
sehr gut! Dies ist eine normale JavaScript-Anweisung, die funktioniert! Lass es laufen!
Um auf die ursprüngliche Frage zurückzukommen: Warum müssen JSON-Strings in Klammern eingeschlossen werden? Wenn Sie es nicht hinzufügen, sieht es so aus:
var str = '{"name": "hanzichi", "age": 10}'; var obj = eval(str); // Uncaught SyntaxError: Unexpected token :
Nun, es wurde ein Fehler gemeldet. Warum wird ein Fehler gemeldet? Versuchen Sie, str „noString“ zu konvertieren und führen Sie Folgendes aus:
{"name": "hanzichi", "age": 10}; // Uncaught SyntaxError: Unexpected token :
Es besteht kein Zweifel daran, dass ein JSON-Objekt oder ein Objekt überhaupt keine ausführbare JavaScript-Anweisung ist! Warten Sie, probieren Sie den folgenden Code aus:
var str = '{name: "hanzichi"}'; var obj = eval(str); console.log(obj); // hanzichi
Was zum Teufel ist das? Aber das Hinzufügen von „“ zum Namen gibt einen Fehler zurück?
var str = '{"name": "hanzichi"}'; var obj = eval(str); // Uncaught SyntaxError: Unexpected token : console.log(obj);
Okay, mir wird fast schwindelig. Tatsächlich können Sie str immer noch „nostringen“, um zu sehen, ob es sich um eine JavaScript-Anweisung handelt, die korrekt ausgeführt werden kann. Das Ergebnis des ersteren ist:
{name: "hanzichi"}
Dies ist in der Tat eine legale JavaScript-Anweisung. {} Wir können es nicht nur in Szenarien wie if- und for-Anweisungen verwenden, sondern auch jederzeit, da JavaScript vor ES6 nur einen Gültigkeitsbereich auf Blockebene hatte, sodass es keinen Konflikt mit dem Gültigkeitsbereich gab. Nach dem Entfernen von {} ist name: „hanzichi“ auch eine Label-Anweisung, die sehr nützlich ist, um aus verschachtelten Schleifen zu springen. Weitere Informationen finden Sie unter label , Name kann nicht in Anführungszeichen gesetzt werden, auch wenn sie nicht verwendet werden.
Sobald ein Objekt zwei Schlüssel hat, z. B. {Name: „hanzichi“, Alter: 10}, ok, zwei Label-Anweisungen? Behandeln Sie „hanzhichi“ und 10 jeweils als Aussagen, Aussagen können jedoch nur mit Siegelnummern verbunden werden! (Zwischen Ausdrücken dürfen nur Kommas verwendet werden). Es ist also kein Problem, es wie folgt zu ändern:
var str = '{name: "hanzichi"; age: 10}'; var obj = eval(str); console.log(obj); // 10
Je weiter wir gehen, desto mehr wurde die Ursache für den Fehler im Code am Anfang des Artikels gefunden. Warum kann er durch Setzen von Klammern behoben werden? Einfach ausgedrückt wandelt () eine Anweisung in einen Ausdruck um, der als Anweisungsausdruck bezeichnet wird. Der Code in Klammern wird in eine Ausdrucksauswertung umgewandelt und zurückgegeben. Das Objektliteral muss als Ausdruck vorliegen.
In diesem Artikel geht es nicht um Ausdrücke. Informationen zu Ausdrücken finden Sie unter dem Link am Ende des Artikels. Denken Sie daran, dass Ausdrücke immer einen Rückgabewert haben. Die meisten Ausdrücke werden in () eingeschlossen und die Klammern dürfen nicht leer sein. Wenn mehrere Ausdrücke durch Kommas getrennt sind, was der sogenannte Komma-Ausdruck ist, wird der Wert des letzten zurückgegeben.
Das Obige ist ein kleines Problem, das Ihnen der Herausgeber zum Parsen von JSON-Strings in JS durch Eval vorstellt. Ich hoffe, es wird für alle hilfreich sein!