Entwicklertools · JSON-Formatierer und -Validator
Wie ein JSON-Validator die genaue Zeile und Spalte eines Fehlers findet
· Wie es funktioniert
json Validierung Entwickler-Workflow
Browser-Engines melden JSON.parse-Fehler unterschiedlich und einige geben nur einen Zeichenversatz an. In diesem Beitrag wird erklärt, wie ein Validator daraus eine Zeile und eine Spalte umwandelt und warum die Position markiert, wo das Parsen aufgehört hat, und nicht, wo Sie den Fehler gemacht haben.
Die Fehlermeldung, die Ihnen nichts sagt – warum „Unerwartetes Token in JSON an Position 1432“ in einer 400-Zeilen-Datei nutzlos ist
Ein Fehler wie „Unerwartetes Token“ ist in einer langen Konfiguration frustrierend, da sie keinen Ort bietet, den Sie in Ihrem Editor öffnen können. JSON.parse ist der autorisierende Parser des Browsers, sein Diagnosetext unterscheidet sich jedoch je nach JavaScript-Engine und -Version. ToolAcre errät den Standort nicht durch den Abgleich einer instabilen englischen Fehlerzeichenfolge. Wenn JSON.parse fehlschlägt, durchsucht ein separater strenger Scanner den Originaltext, um das erste Zeichen zu identifizieren, das die JSON-Grammatik nicht akzeptieren kann.
Was ein JSON-Parser beim Lesen tatsächlich tut – ein Rundgang durch die Tokenisierung und die rekursiv absteigende Grammatik, die jeweils einen Wert verbraucht
JSON verfügt über sechs Strukturzeichen – geschweifte Klammern, Klammern, Doppelpunkt und Komma – und Werte, die Zeichenfolgen, Zahlen, Arrays, Objekte, wahr, falsch oder null sein können. Ein Scanner muss wissen, ob es sich innerhalb einer Zeichenfolge in Anführungszeichen befindet, bevor er ein Komma als Trennzeichen bezeichnen kann: {"note": "A,B"} hat einen Wert, nicht zwei. Es durchläuft einen Wert oder ein Objektmitglied und prüft, was rechtlich als nächstes folgen kann. RFC 8259 definiert diese Grammatik und erlaubt im Gegensatz zu JavaScript-Objektliteralen keine Kommentare oder nachgestellten Kommas.
Vom Zeichenoffset zu Zeile und Spalte – Zählen von Zeilenumbrüchen bis zum Fehleroffset und warum CRLF-Endungen und Multibyte-Zeichen die Zählung erschweren
Ein Scanner beginnt normalerweise mit einem auf Null basierenden Offset im ursprünglichen JavaScript-String. Um dies nützlich zu machen, zählen Sie die Zeilenumbrüche vor dem Offset und ermitteln Sie, wie weit der Fehler vom letzten Bruch entfernt liegt. CRLF sollte als ein einziges visuelles Zeilenende behandelt werden, nicht als zwei Zeilen; Positionen in JavaScript-Strings zählen UTF-16-Codeeinheiten, nicht UTF-8 bytes auf der Festplatte. Ein Nicht-BMP-Emoji kann zwei Codeeinheiten in einem Editor belegen, der eine Glyphe visuell anzeigt. Die Benutzeroberfläche meldet eine Zeile, eine Spalte und einen Auszug, sodass Sie die Einfügemarke mit der von Ihnen eingefügten Datei vergleichen können.
Der Fehler liegt nicht dort, wo die Analyse aufhört – ein fehlendes Komma wird beim nächsten Schlüssel gemeldet, und ein verirrtes Anführungszeichen kann den Fehler um viele Zeilen nach unten verschieben
Das erste unmögliche Zeichen liegt oft nach dem ursprünglichen Fehler. Wenn in einem Objekt ein Komma nach „true“ vergessen wird, wird das Anführungszeichen am Anfang der nächsten Eigenschaft ungültig: Der Parser hat ein Komma oder eine schließende Klammer erwartet. Eine nicht abgeschlossene Zeichenfolge kann dazu führen, dass der Fehler bei einem späteren Zeilenumbruch oder am Ende der Eingabe auftritt. Lesen Sie vom gemeldeten Punkt aus rückwärts, um das fehlende Trennzeichen zu finden. Gehen Sie nicht davon aus, dass das Zeichen unter dem Caret gelöscht werden muss.
Ausgearbeitetes Beispiel: eine Konfiguration mit einem fehlenden Komma – die gemeldete Position, die umgebenden Token und wie man zurück zur eigentlichen Ursache gelangt
Versuchen Sie es mit dem wörtlichen dreizeiligen Dokument {"name": "demo", gefolgt von "enabled":true in Zeile zwei und "port":8080} in Zeile drei, ohne Komma nach true. ToolAcre meldet Zeile 3, Spalte 1, Offset 31: Es erwartete ein Komma oder } nach der vorhergehenden Eigenschaft und zeigt ein Caretzeichen unter dem ersten Anführungszeichen von „port“. Fügen Sie am Ende der zweiten Zeile ein Komma ein und bestätigen Sie dann erneut. Hierbei handelt es sich um eine Diagnose des ersten Syntaxhindernisses und nicht um eine Beurteilung, dass das Wort „Port“ falsch ist.
Wie sich Browser-Engines unterscheiden – V8, SpiderMonkey und JavaScriptCore formulieren denselben Fehler unterschiedlich, weshalb ein konsistenter Zeilen- und Spaltenbericht hilfreich ist
V8, SpiderMonkey und JavaScriptCore haben unterschiedliche Formulierungen und manchmal unterschiedliche kontextbezogene Snippets für denselben JSON.parse-Fehler verwendet. Der Scanner von ToolAcre liefert seinen eigenen strukturellen Grund und Standort, wenn der native Parser den Wert ablehnt. Wenn der Scanner jemals mit JSON.parse nicht einverstanden ist, gibt das Tool den Engine-Fehler zurück, anstatt eine Position zu erstellen. Dieser Rückgriff ist sicherer, als selbstbewusst auf einen erratenen Charakter zu zeigen.
Was dadurch nicht abgedeckt wird – semantische Probleme wie falsche Typen, fehlende Felder oder Schemaverletzungen, die ein Syntaxvalidator niemals melden wird
Ein syntaktisch gültiges Objekt kann für Ihre Anwendung dennoch falsch sein: Ein fehlendes Pflichtfeld, ein als Text geschriebenes Alter, zwei doppelte Schlüssel oder ein Verweis auf eine nicht vorhandene Datei sind nicht automatisch ungültiges JSON. RFC 8259 besagt, dass Mitgliedsnamen aus Gründen der Interoperabilität eindeutig sein sollten, aber bloßes Parsen erzwingt Ihr API-Schema nicht. Überprüfen Sie hier die Syntax und validieren Sie semantische Einschränkungen in dem Programm, das das Dokument verarbeitet.
Fazit: Lesen Sie die Position als „das erste Token, das die Grammatik nicht akzeptieren konnte“ – und wie der JSON-Formatierer und -Validator diese Zeile und Spalte meldet, ohne den Text hochzuladen
Behandeln Sie die gemeldete Position als „das erste Zeichen, das diese Grammatik nicht akzeptieren konnte“. Arbeiten Sie rückwärts zur Ursache, beheben Sie ein Problem und führen Sie es erneut aus. Der JSON-Formatierer und -Validator erledigt dies lokal, ohne eine eingefügte Konfiguration hochzuladen. Fügen Sie keine echten Produktionsanmeldeinformationen in eine öffentliche Website ein, wenn stattdessen ein Offline-Editor die Datei diagnostizieren kann.