Ich baue Toolz.dev‘und davor habe ich jahrelang WordPress-Plugins und Laravel-APIs verschickt In all dem ist die einzige Fehlermeldung, für die ich die meisten Stunden verschwendet habe, eine Variation von & quot; Angenommenes Token in JSON an Position 428." Es sagt Ihnen fast nichts Es gibt keine Zeile, keine Spalte, und die Position, die es benennt, liegt häufig ein paar Zeichen hinter der Sache, die falsch ist Man zählt am Ende Zeichen in einem minifizierten Blob von Hand, oder fügt die ganze Nutzlast in einen Editor ein und schielt Ich habe das gebaut JSON-Validator Also muss ich das nie wieder tun, und das ist der Leitfaden, was es tut und warum die Validierung von JSON schwieriger ist, als es aussieht.
tl; dr: Ein JSON-Validator überprüft Text mit der Grammatik in RFC 8259 und sagt Ihnen, wenn der Text defekt ist, die genaue Zeile, Spalte und das Zeichen des ersten Fehlers, phrasiert nach dem, was er erwartet hat. Es fängt auch Dinge ein, die ein normaler Parser verbirgt: doppelte Schlüssel, die stillschweigend auf den letzten Wert kollabiert werden, und es meldet die Struktur eines gültigen Dokuments (Objekt-, Array- und Schlüsselanzahl, Verschachtelungstiefe und Bytegröße). Es handelt sich nicht um einen Formatierer. Ein Formatierer geht davon aus, dass die Eingabe bereits gültig ist; Ein Validator ist genau das, wofür Sie greifen, wenn er nicht gilt.
Was bedeutet es für JSON gültig zu sein?
JSON ist ein kleines Format mit strenger Grammatik Der aktuelle Standard ist RFC 8259(was mit übereinstimmt ECMA-404‘und zwischen ihnen definieren sie genau, was ein gültiges Dokument enthalten darf’ Ein JSON-Text ist ein einzelner Wert Dieser Wert ist ein Objekt, ein Array, eine Zeichenfolge, eine Zahl, true, false, oder null. Gegenstände werden in eine Zahnspange gewickelt und halten Komma getrennt "key": value Paare Arrays sind in Klammern gewickelt und halten kommagetrennte Werte, Strings sind in doppelte Anführungszeichen gewickelt, niemals einfache Anführungszeichen Zahlen folgen einer bestimmten Form ohne führende Nullen und ohne nachlaufenden Dezimalpunkt Es gibt keine Kommentare, und es gibt keine nachlaufenden Kommas.
In diesem letzten Satz geht das meiste JSON in der realen Welt schief, denn viele der JSON-Leute schreiben von Hand, das ist nicht wirklich JSON. Es ist eine Konfigurationsdatei mit // Kommentare, oder ein aus JavaScript-Quelle kopiertes Objekt, bei dem einzelne Anführungszeichen und nachfolgende Kommas in Ordnung sind, oder eine handbearbeitete Leuchte, bei der jemand ein Feld hinzugefügt und ein baumelndes Komma hinterlassen hat All dies wird von einem strengen Parser abgelehnt, und ein Validator's Aufgabe ist es, sie an einer bestimmten Stelle und nicht mit einem Achselzucken abzulehnen.
Ein Punkt, der es wert ist, geklärt zu werden, denn er bringt Menschen auf den Punkt, die vor Jahren JSON gelernt haben: Ein nackter Wert ist ein vollständiges, gültiges JSON-Dokument. 42 Für sich genommen gilt JSON. So ist "hello"& so ist true. Das Alte RFC 4627 Erforderte, dass die oberste Ebene ein Objekt oder ein Array sein muss, aber diese Einschränkung wurde 2014 aufgehoben, als RFC 7159 (später 8259) sie ablöste. Wenn ein Tool es Ihnen sagt 42 JSON ist nicht gültig, dieses Tool folgt einer Spezifikation, die seit über einem Jahrzehnt veraltet ist.
Warum ist JSON.parse so ein schlechter Fehlerreporter?
Der Grund, warum ein engagierter Validator seinen Platz verdient, ist, dass der in Ihre Sprache integrierte Parser für den glücklichen Weg optimiert ist und nicht für die Erklärung des traurigen. JSON.parse In einem Browser wirft ein SyntaxError Wessen Nachricht ist engine-spezifisch und gibt Ihnen normalerweise einen Zeichenoffset ohne Zeile oder Spalte V8 sagt & quot; Annexpected token } in JSON an Position 148." Firefox sagt " JSON.parse: unerwartetes Zeichen in Zeile 1 Spalte 149." Safari sagt wieder etwas anderes Keiner von ihnen sagt Ihnen, was sie erwartet haben, und die Position wird vom Anfang der Zeichenfolge gemessen, was in dem Moment nutzlos ist, in dem Ihr JSON mehr als ein paar Zeilen hat.
Der Validator auf Toolz.dev verwendet nicht JSON.parse. Es geht mit einem handgeschriebenen Parser mit rekursivem Abstieg durch den Text selbst und verfolgt dabei die Zeile und Spalte, sodass Sie beim Stoppen alle drei Koordinaten erhalten können: die Zeile, die Spalte und den absoluten Zeichenversatz. Noch wichtiger ist, dass es die Grammatikregel kennt, in der es sich befand, also ist die Nachricht spezifisch. Anstelle von & quot; nicht erwarteter Token und Quot; erhalten Sie " Trailing-Komma ist vor der Schließspange nicht erlaubt, & quot; Objekttasten müssen doppelt zitierte Zeichenfolgen sein, " oder " Sie müssen eine Datei oder eine Schließspange für die Zielspange festlegen, wenn es fünf Sekunden nach einem Objekt liegt.
Es zeichnet auch einen Caret unter das genaue Zeichen auf der beleidigenden Zeile, so wie es ein Compiler tut Wenn Sie Zeile 34 einer Config-Datei betrachten, ist & quot; Spalte 12" in Ordnung, aber ein ^ Direkt unter dem Streunerzitat zu sitzen ist schneller.
Welche JSON-Fehler fängt der Validator namentlich ein?
Das sind die Ausfälle, die ich am häufigsten sehe, sowohl in meiner eigenen Arbeit als auch in den Support-Threads für solche Tools Der Validator benennt jeden einzelnen, anstatt einen generischen Token-Fehler zu melden.
| Fehler | Wie es aussieht | Warum es ungültig ist |
|---|---|---|
| Nachlaufkomma | {"a": 1,} oder [1, 2,] |
JSON hat keine nachlaufenden Kommas; Die Standard- und #39;s-Grammatik erlaubt einfach keins vor einer schließenden Klammer oder Klammer |
| Einzelzitate | {'name': 'Liton'} |
Zeichenfolgen und Tasten müssen doppelte Anführungszeichen verwenden; Einfache Anführungszeichen sind eine JavaScript-Gewohnheit, kein JSON |
| Fehlendes Komma | {"a": 1 "b": 2} |
Jedem Mitglied nach dem ersten muss ein Komma vorangestellt sein |
| Kommentar | {"a": 1} // note |
JSON hat keine Kommentar-Syntax; die // Und alles danach ist unerwarteter Inhalt |
| Nicht zitierter Schlüssel | {name: "Liton"} |
Schlüssel sind Zeichenfolgen und müssen im Gegensatz zu JavaScript-Objektliteralen zitiert werden |
| Null anführen | {"n": 007} |
Eine Zahl hat möglicherweise keine führende Null, also 007 Ungültig ist; schreiben 7 |
| Nachlaufdezimalstelle | {"n": 5.} |
Der Bruch nach einem Dezimalpunkt benötigt mindestens eine Ziffer |
| Rohsteuerzeichen | Eine wörtliche Registerkarte oder Zeilenumbruch innerhalb einer Zeichenfolge | Steuerzeichen innerhalb von Zeichenfolgen müssen als entgangen werden \t, \nund so weiter |
| NaN oder Infinity | {"n": NaN} |
Diese sind in JavaScript gültig, aber keine JSON-Werte |
| Unterminierte Saite | {"a": "oops} |
Eine Zeichenfolge ohne schließendes Zitat läuft bis zum Ende der Eingabe |
Jeder von diesen erzeugt eine einfachsprachige Nachricht und eine Position Der Fall mit der führenden Null ist ein schönes Beispiel dafür, warum ein speziell entwickelter Parser hilft: Ein generischer Parser liest 007 als die Zahl 0 Und dann Ausflüge über die 7 Als " Extrainhalt, " Wir zeigen Sie auf die 7‘s, wenn das eigentliche Problem die beiden Nullen davor sind Der Validator prüft zuerst nach dem Muster führend-null und sagt Ihnen das direkt.
Wie sieht es mit doppelten Schlüsseln aus?
Hier ist der, der mich in der Produktion mehr gebissen hat als jeder Syntaxfehler, denn es ist überhaupt kein Syntaxfehler Das ist gültiges JSON:
{
"timeout": 30,
"retries": 3,
"timeout": 60
}
RFC 8259 sagt, dass die Namen innerhalb eines Objekts & quot; SOLLE eindeutig sein, & quot; aber es verbietet nicht Duplikate, so dass ein Parser dies akzeptieren muss Als nächstes kommt es, wo das Problem beginnt: Der Standard sagt, dass das Verhalten mit doppelten Namen unvorhersehbar ist, und in der Praxis behält fast jeder Parser den letzten Wert und verwirft stillschweigend die früheren. Also analysiert dieses Objekt {"timeout": 60, "retries": 3}und das "timeout": 30 Sie sorgfältig eingestellt am oberen Rand der Datei ist ohne eine Warnung weg Wenn zwei Personen die Konfiguration bearbeitet haben, oder eine Zusammenführung schief gelaufen ist oder ein Vorlagenschritt zweimal denselben Schlüssel ausgegeben hat, haben Sie einen Fehler, den kein Parser jemals für Sie markiert.
Der Validator markiert es Duplicate-key detection ist standardmäßig eingeschaltet, und weil ein Duplikat legal ist, wird es als Warnung und nicht als Fehler gemeldet: das Dokument ist immer noch gültig, aber man sagt Ihnen jeden Schlüssel, der mehr als einmal im selben Objekt erscheint, mit seiner Zeile und einem JSON-Zeiger Pfad, damit Sie es in einer verschachtelten Struktur finden können Wenn Sie wirklich Duplikate wünschen, können Sie den Haken ausschalten. Meistens ist das Sehen der Warnung der Moment, in dem Sie erkennen, was schief gelaufen ist.
Wie unterscheidet sich ein Validator von einem Formatierer?
Die Leute verwenden die Wörter synonym, und die Werkzeuge überschneiden sich, aber sie beantworten unterschiedliche Fragen A JSON-Formater Nimmt JSON, von dem Sie bereits glauben, dass es gültig ist, und druckt es mit konsistenter Einrückung neu, damit ein Mensch es lesen kann. Wenn Sie einem Formatierer kaputtes JSON geben, kann er es am besten ablehnen. Ein Validator's ist der ganze Zweck der defekte Fall: Er sagt Ihnen, wo und warum. Der Toolz.dev-Validator erledigt beide Aufgaben, denn sobald er bestätigt hat, dass ein Dokument gültig ist, hat er es bereits analysiert, also druckt er das Ergebnis im selben Durchgang ziemlich auf. Das Überschriftenmerkmal ist jedoch die Diagnose, nicht die Einrückung.
Die gleiche Beziehung gilt für die benachbarten Werkzeuge. Die JSON-Minifier Streifen Leerraum, um eine Nutzlast zu verkleinern, was nur bei gültiger Eingabe Sinn macht Die JSON-Sortierer Bestellt Schlüssel für stabile Diffs neu, wieder auf gültige Eingabe Die JSON entkommt und entkommt Werkzeug befasst sich mit der Einbettung von JSON in eine Zeichenfolge Und die JSONPath-Tester Abfragen ein Dokument, das Sie bereits bestätigt haben, ist wohlgeformt Validierung ist der Schritt, der vor allen steht, weshalb es der ist, den ich zuerst ausführe, wenn sich eine API-Antwort oder eine Config-Datei seltsam verhält Es gibt einen breiteren Rundgang, wie diese in die Ultimative Anleitung zu JSON-Toolsdrohen
Was sagt Ihnen die Strukturstatistik?
Wenn ein Dokument validiert, meldet das Tool seine Form: wie viele Objekte und Arrays es enthält, wie viele Tasten, wie viele Zeichenfolgen, Zahlen, Booleans und Nullstellen, wie tief es nistet, und seine Größe in beiden Zeichen und UTF-8 Bytes. Das ist keine Dekoration. Wenn Ihnen eine unbekannte API-Antwort ausgehändigt wird, sagt Ihnen die Tiefenzahl auf einen Blick, ob Sie es mit einer flachen Platte oder einem tief verschachtelten Baum zu tun haben, und die Schlüsselanzahl sagt Ihnen ungefähr, wie viel Arbeit das Parsen haben wird.
Die Byte-Zahl ist wichtiger, als die Leute erwarten Anforderungsgrößenbeschränkungen, Nachrichten-Warteschlangen-Grenzwerte und Datenbankspalten-Grenzwerte werden fast immer in Bytes und nicht in Zeichen gemessen, und die beiden unterscheiden sich in dem Moment, in dem Ihr JSON etwas außerhalb von ASCII enthält Ein Emoji oder ein akzentuierter Name ist ein Zeichen auf dem Bildschirm, aber zwei, drei oder vier Bytes auf dem Draht Wenn eine Nutzlast gegen eine 256-KB-Grenze stößt, führt Sie die Zeichenanzahl in die Irre und die Byte-Zählung nicht. Der Validator berechnet die wahre UTF-8 Byte-Länge, sodass die Zahl, die Sie sehen, die Zahl ist, die das Limit zählt.
Wie ich es benutze
Mein Workflow ist langweilig und schnell, was der Punkt ist, wenn eine Integration kaputt geht, kopiere ich den Rohantwortkörper direkt aus dem Netzwerk-Tab und füge ihn in den Validator ein, wenn er gültig ist, sagen mir das grüne Ergebnis und die Statistiken, dass das Problem woanders liegt, in meinem Code und nicht in ihren Daten, und ich habe eine ganze Klasse von Ursachen ausgeschlossen Wenn er ungültig ist, bekomme ich Zeile und Spalte, fixiere ihn und gehe weiter Wenn ich eine Konfigurationsdatei handbearbeite, füge ich sie vor dem Festlegen ein, hauptsächlich um das nachgestellte Komma zu fangen, das ich immer zurückzulassen scheine, und der gelegentliche Duplikatschlüssel aus einem Kopiereinfügen. Für jeden, der sein eigenes Kit zusammen mit dem wesentlichen Webentwickler-Toolkitdrohen
Der Sichtschutzwinkel ist auch kein nachträglicher Einfall Die JSON-Leute, die am meisten validieren müssen, sind genau die JSON, mit denen sie am vorsichtigsten sein sollten: API-Antworten mit Token, Konfigurationsdateien mit Anmeldeinformationen, Nutzlasten mit Kundendaten Alles, was der Validator tut, passiert in Ihrem Browser, in JavaScript, auf Ihrem Computer Es wird nichts hochgeladen, protokolliert oder gespeichert. Sie können es beweisen, indem Sie die Netzwerkkarte öffnen, während Sie validieren, oder indem Sie die Verbindung zum Internet trennen und beobachten, wie das Tool weiter funktioniert.
Häufig gestellte Fragen
Warum sagt mein JSON, dass es ungültig ist, wenn es gut aussieht?
Die häufigsten Gründe sind ein nachlaufendes Komma vor einer schließenden Klammer oder Klammer, einzelne Anführungszeichen, bei denen JSON doppelte Anführungszeichen benötigt, ein fehlendes Komma zwischen zwei Mitgliedern oder ein Kommentar, den JSON überhaupt nicht zulässt Alle vier sind leicht mit dem Auge zu übersehen, besonders in einer großen Datei Der Validator nennt, welchen er gefunden hat und gibt Ihnen die genaue Zeile und Spalte an, also springen Sie, anstatt das ganze Dokument zu scannen, direkt zu dem Zeichen, auf dem es aufgehört hat.
Ist eine einzelne Zahl oder Zeichenfolge allein gültig JSON?
Ja. Unter RFC 8259 ist jeder JSON-Wert ein vollständiger JSON-Text, also 42, "hello", true, und null Alle für sich validieren Die Regel, dass die oberste Ebene ein Objekt oder ein Array sein musste, stammt aus dem älteren RFC 4627 und wurde 2014 entfernt Ein Tool, das einen nackten Wert ablehnt, folgt einer veralteten Spezifikation.
Ändert oder lädt der Validator meine Daten hoch?
Nein. Es analysiert den Text in Ihrem Browser und sendet ihn nie irgendwohin. Auf einem gültigen Dokument wird der Einfachheit halber eine hübsch gedruckte Kopie erstellt, aber diese Kopie wird lokal generiert und das Original wird nie übertragen, protokolliert oder gespeichert. Da es keine Server-Roundtrip gibt, funktioniert das Tool auch mit dem Netzwerk, das nach dem Laden der Seite getrennt wurde.
Warum sollte ich mich um doppelte Schlüssel kümmern, wenn der JSON noch gültig ist?
Denn ein Duplikat bedeutet fast immer Datenverlust, den Sie nicht beabsichtigt haben Der Standard erlaubt doppelte Schlüssel, lässt aber deren Handhabung undefiniert, und in der Praxis behalten Parser nur den letzten Wert und lassen den Rest fallen Also eine Config wo timeout Zweimal erscheint leise verliert die erste Einstellung Der Validator warnt Sie vor jeder wiederholten Taste mit seiner Position, die normalerweise der Moment ist, in dem Sie eine fehlerhafte Zusammenführung oder einen Copy-Paste-Fehler entdecken.
Kann dies JSON mit Kommentaren validieren, z. B. einer tsconfig- oder VS-Code-Einstellungsdatei?
Nein, und das ist gewollt JSON with Comments (JSONC) oder JSON5, das sind separate Formate, die die Regeln lockern Der Validator zielt auf den strengen RFC 8259, also markiert er einen Kommentar als Fehler Wenn Sie Kommentare in einer Konfigurationsdatei benötigen, ist das ein Signal, das Format sollte etwas dafür gebaut sein, wie YAML oder TOML, anstatt JSON über das hinaus zu strecken, was der Standard zulässt.
Was ist der Unterschied zwischen der Validierung und Formatierung von JSON?
Validieren prüft, ob der Text der JSON-Grammatik gehorcht und, wenn nicht, sagt Ihnen genau, wo er kaputt geht Formatieren geht davon aus, dass der Text bereits gültig ist und passt nur seinen Leerraum für die Lesbarkeit an Man greift zu einem Validator, wenn etwas nicht stimmt und man muss wissen, was; man greift zu einem Formatierer, wenn alles in Ordnung ist und man will ihn nur lesbar haben Dieses Tool tut beides, aber sein Existenzgrund ist die Diagnose.
Wie groß kann ich eine Datei validieren?
Bequem in die zig Megabyte, begrenzt nur durch Ihren Browser' s Speicher, denn das ganze Dokument wird in einem Durchgang auf Ihrem Gerät analysiert Es gibt keine Obergrenze für die Upload-Größe, da es keinen Upload gibt Für eine wirklich riesige Datei, in den Gigabyte, ist ein Streaming-Befehlszeilenprüfer das bessere Instrument, da der Browser den gesamten Text auf einmal im Speicher hält.



