Deutsch

Entwicklertools · JSON Formatierer und Validator

Die gesamte JSON-Grammatik auf einer Seite: sechs Werttypen, zwei Container

· Hintergrund

json Standards Validierung

Die gesamte JSON-Grammatik auf einer Seite: sechs Werttypen, zwei Container illustriert mit JSON-Tokens und eine präzise Validierungsgrenze
Die gesamte Grammatik von
Original-ToolAcre-Vektorillustration

JSON passt auf eine Seite, und wenn man sie auswendig kennt, ist jeder Validatorfehler offensichtlich. In diesem Beitrag gehen wir durch die sechs Werttypen, die beiden Container und die Handvoll Regeln, die Menschen zum Stolpern bringen.

Jeder Fehler, den Sie jemals gesehen haben, stammt von einer Seite

Jeder Syntaxfehler ist eine gebrochene Erwartung in einer kompakten Grammatik. Nachdem ein Objekt geöffnet wurde, erwartet ein Parser einen Mitgliedsnamen in Anführungszeichen oder eine schließende geschweifte Klammer; nach einem Namen wird ein Doppelpunkt erwartet; nach einem Wert erwartet es ein Komma oder das Ende des Containers. Es ist sinnvoller, einen Fehler als fehlgeschlagenen Übergang zu interpretieren, als den gemeldeten Charakter als mysteriös zu behandeln.

ToolAcre akzeptiert die Standardwerte JSON und Leerzeichen und wendet dann zwei praktische Eingabebeschränkungen an. Text, der länger als 8,000,000 Zeichen ist, wird vor dem Parsen abgelehnt, und Scannerverschachtelungen über 512 Container hinaus werden abgelehnt und nicht auf unbestimmte Zeit durchlaufen. Dabei handelt es sich um Produktgrenzen, nicht um neue JSON-Typen. Darin identifiziert die Diagnose den ersten Punkt, an dem der Token-Stream die Grammatik nicht mehr erfüllen kann.

Die sechs Werte – Objekt, Array, String, Zahl, true/false und null, und die Tatsache, dass es nichts anderes gibt

Ein JSON-Wert ist ein Objekt, Array, String, Zahl, Boolescher Wert oder Null. Objekte und Arrays können jeden der sechs Container enthalten, einschließlich weiterer Container. Die wörtlichen Schreibweisen sind genau `true`, `false` und `null`; Die Großschreibung ist nicht flexibel. Token wie `True`, `None`, `undefined`, `NaN` und `Infinity` liegen außerhalb des strengen JSON, selbst wenn eine andere Sprache einige davon erkennt.

Diese kurze Liste macht die Klassifizierung zu einer nützlichen Debugging-Technik. In `{"reading": NaN}` leitet der Doppelpunkt korrekt einen Wert ein, aber `N` darf keinen zulässigen Wert beginnen. Ersetzen Sie es erst, nachdem Sie entschieden haben, was die Daten bedeuten sollen, vielleicht `null` oder einen Status in Anführungszeichen. Ein Syntaxtool kann das Token ablehnen; Es kann nicht den Ersatz der Anwendung auswählen oder entscheiden, ob das Feld dorthin gehört.

Objekte und Arrays – durch Kommas getrennte Mitglieder, der Doppelpunkt und warum RFC 8259 die Reihenfolge und doppelte Namen den Implementierungen überlässt

Objekte enthalten durch Kommas getrennte Namen/value-Mitglieder. Jeder Name ist eine Zeichenfolge in doppelten Anführungszeichen, gefolgt von einem Doppelpunkt und einem Wert. Arrays enthalten durch Kommas getrennte Werte ohne Namen oder Doppelpunkte. Leere Container `{}` und `[]` sind gültig, aber ein Komma darf nicht vorangestellt, nachgestellt oder zweimal vorkommen. Durch die Zuordnung jedes Trennzeichens zu seinem Container werden schnell viele offensichtliche „unerwartete Token“-Fehler aufgedeckt.

Es wird erwartet, dass Objektnamen eindeutig sind, doppelte Schreibweisen werden jedoch von diesem Validator nicht abgelehnt. `{"port": 80, "port": 443}` analysiert und `JSON.parse` behält den späteren Wert. Durch die Formatierung wird dann nur das verbleibende Element ausgegeben, sodass der frühere Text nicht aus dem Ergebnis wiederhergestellt werden kann. Array-Positionen verhalten sich unterschiedlich: Jedes Element bleibt vorhanden und seine Reihenfolge ist Teil des Werts.

Zeichenfolgen und Zahlen präzise

Zeichenfolgen verwenden doppelte Anführungszeichen. Ein Backslash kann ein Anführungszeichen, einen Backslash, einen Schrägstrich, `b`, `f`, `n`, `r`, `t` oder ein vierstelliges Unicode-Escape einleiten; Rohe Steuerzeichen sind verboten. Einfache Anführungszeichen sind gewöhnliche ungültige Token außerhalb einer Zeichenfolge. Diese Regeln erklären, warum kopierte JavaScript-Literale und eingefügter mehrzeiliger Text lesbar aussehen können, obwohl die strenge JSON-Validierung fehlschlägt.

Eine Zahl kann ein Minuszeichen, einen ganzzahligen Teil, einen optionalen Bruch und einen optionalen Exponenten haben. Es darf nicht mit `+` beginnen, keine Hexadezimalschreibweise verwenden, keine führende Null vor einer anderen Ziffer enthalten oder einen nicht endlichen Wert buchstabieren. `-0.25e+2` ist gültig; `01`, `.5`, `2.` und `Infinity` sind es nicht. Beim Parsen wird die Grammatik überprüft, nicht ob JavaScript jede Ziffer exakt beibehalten kann.

Leerzeichen und die oberste Ebene

Außerhalb von Zeichenfolgen ist der Leerraum JSON auf Leerzeichen, horizontale Tabulatortaste, Zeilenvorschub und Wagenrücklauf beschränkt. Ein von einer Webseite kopierter geschützter Bereich ist nicht mit einem gewöhnlichen Bereich austauschbar. Bei der Formatierung kann frei zwischen zulässigen Leerzeichen um Token herum gewählt werden, es müssen jedoch Leerzeichen erhalten bleiben, die in eine Zeichenfolge in Anführungszeichen gehören, da es sich bei diesen Zeichen um Daten handelt.

Das vollständige Dokument kann ein beliebiger einzelner JSON-Wert sein, nicht nur ein Objekt oder Array. `42`, `false` und `"ready"` sind gültige Texte der obersten Ebene. Verboten ist ein zweiter Wert nach dem ersten: `42 43` sind zwei Dokumente, nicht eines. Diese Unterscheidung erklärt, warum das durch Zeilenumbrüche getrennte JSON eine Datensatz-für-Datensatz-Behandlung erfordert und nicht eine gewöhnliche Analyse der gesamten Datei.

Arbeitsbeispiel: Manuelles Parsen eines kleinen Dokuments

Nehmen Sie `{"order": [17, null, {"paid": true}], "note": "ship soon"}`. Das Stammobjekt beginnt mit einem Mitglied namens `order`; Sein Wert ist ein Array, das eine Zahl, Null und ein anderes Objekt enthält. Ein Komma leitet dann `note` ein, dessen Wert eine Zeichenfolge mit einem maskierten Zeilenumbruch ist. Jeder Doppelpunkt, jedes Komma und jedes Schlusstrennzeichen hat eine grammatikalische Funktion.

Entfernen Sie nun das Zitat vor `paid`. Nach der verschachtelten Klammer erwartet der Parser eine schließende Klammer oder einen Namen in Anführungszeichen und schlägt daher bei `p` fehl. Alternativ können Sie nach `true` ein Komma hinzufügen. Der Parser akzeptiert das Komma und schlägt dann bei `}` fehl, da ein anderes Mitglied folgen muss. Die manuelle Vorhersage dieser Positionen verwandelt die Validierung in eine Bestätigung und verhindert zufällige Änderungen der Zeichensetzung.

Was dies nicht abdeckt

Die Grammatik hat keinen Datums-, Dezimal-Geld-, Binär-, UUID- oder Dauertyp. Anwendungen stellen diese Konzepte normalerweise mit Zeichenfolgen oder Zahlen dar und legen Konventionen separat fest. Ein Zeitstempel kann eine vollkommen gültige Zeichenfolge JSON sein, aber ein unmögliches Datum enthalten. Ebenso kann ein syntaktisch gültiges Objekt erforderliche Eigenschaften weglassen oder die falschen Einheiten verwenden, ohne eine einzige Parsing-Regel zu verletzen.

ToolAcre führt keine Schemaprüfungen, Domänenvalidierung oder Kanonisierung durch. Außerdem werden JSON5- oder JSONC-Funktionen wie Kommentare und nachgestellte Kommas nicht neu interpretiert. Seine Aufgabe ist enger gefasst: Akzeptieren Sie einen strengen JSON-Text innerhalb der Produktgrenzen, formatieren Sie den analysierten Wert und identifizieren Sie Syntaxfehler. Behalten Sie spätere Fragen zu Form und Bedeutung in der Validierungsschicht der nutzenden Anwendung.

Takeaway: Merken Sie sich die Grammatik, vertrauen Sie der Position

Die dauerhafte Checkliste ist kurz: sechs Wertkategorien, Objektnamen in Anführungszeichen, Kommas nur zwischen Elementen, Doppelpunkte nur zwischen Namen und Werten, strikte Zeichenfolgen-Escapezeichen, strikte Zahlenschreibweise, vier Leerzeichen und genau ein Wert auf oberster Ebene. Wenn ein Dokument fehlschlägt, ermitteln Sie, was die Grammatik unmittelbar vor der gemeldeten Position zulässt, und vergleichen Sie diese Erwartung mit dem tatsächlich vorhandenen Zeichen.

Vertraue der Position als dem ersten unmöglichen Punkt, nicht immer dem Zeichen, das gelöscht werden muss. Eine schließende geschweifte Klammer kann hervorgehoben werden, weil ein vorangehendes Komma ein anderes Element verspricht; Ein unschuldiger Brief kann hervorgehoben werden, weil sein Eröffnungszitat fehlt. Beheben Sie die Ursache, führen Sie die Validierung erneut durch und wiederholen Sie den Vorgang. Beheben Sie bei übergroßen oder extrem tiefen Eingaben die Produktgrenze von 8 Millionen Zeichen oder 512 Tiefe, bevor die Syntaxdiagnose helfen kann.