JSON formatieren und prüfen

JSON formatieren, validieren und untersuchen — mit einer Fehlermeldung, die auf das Zeichen zeigt.

Ausgabe
{
  "name": "jaguar",
  "speed_kph": 80,
  "habitats": [
    "rainforest",
    "wetland"
  ],
  "conservation": {
    "status": "Near Threatened",
    "assessed": 2016
  },
  "nocturnal": null
}

Gültiges JSON

Größe
145 B
Minimiert
145 B
Gespart
0%
Schlüssel
7
Objekte
2
Maximale Tiefe
3

Die vier Fehler

Fast jedes abgewiesene Dokument scheitert an derselben Handvoll Gründe, und alle vier sind Dinge, die JavaScript akzeptiert hätte. Das ist die Falle: JSON sieht aus wie ein JavaScript-Objektliteral und ist eine deutlich striktere Teilmenge davon.

GeschriebenProblemRichtig
{"a": 1,}Komma am Ende{"a": 1}
{'a': 1}Einfache Anführungszeichen{"a": 1}
{a: 1}Schlüssel ohne Anführungszeichen{"a": 1}
{"a": 1} // noteKommentarEntfernen

Zwei weitere, die seltener zuschlagen, aber schwerer zu sehen sind. NaN, Infinity und undefined sind gültige JavaScript-Werte und keiner davon ist ein JSON-Wert — Ersatz ist null oder eine Zeichenkette. Und ein echter Zeilenumbruch in einer Zeichenkette ist ungültig; dort müssen die beiden Zeichen \n stehen.

Wie dieser Validator Fehler meldet

Das gehört erklärt, denn es ist der Grund, einen Formatter dem anderen vorzuziehen. Für den Erfolgsfall wird das browsereigene JSON.parse genutzt, für die Fehlerbeschreibung nicht: Sein Meldungsformat ist ein Implementierungsdetail, das sich in jüngeren V8-Versionen zweimal geändert hat. Dasselbe kaputte Dokument meldet auf einer Node-Version „Unexpected end of JSON input“ und auf einer anderen „Expected ‘,’ or ‘}’ after property value at position 6“ — und manchmal gar keine Position.

Scheitert das Parsen, geht diese Seite deshalb selbst durch die Grammatik und meldet Zeile, Spalte und das Zeichen, an dem sie stehen blieb, mit einem Caret darunter. Die Meldung, die Sie bekommen, hängt nicht davon ab, welchen Browser Sie gerade benutzen.

Das Genauigkeitsproblem, vor dem niemand warnt

Es verursacht echte Fehler und wird fast nie erwähnt. JSON-Zahlen werden zu JavaScript-Zahlen, und JavaScript-Zahlen sind IEEE-754-Doubles. Ganze Zahlen oberhalb von 2⁵³ — rund 9,007 Billiarden — lassen sich nicht exakt darstellen.

Eine 19-stellige Kennung der Art, wie Twitter, Discord und die meisten Snowflake-artigen ID-Schemata sie erzeugen, kommt verändert zurück, stillschweigend, ohne Fehlermeldung irgendwo. Fügen Sie {"id": 9007199254740993} oben ein und sehen Sie zu, wie sich die letzte Ziffer verschiebt.

Behoben wird das auf der Erzeugerseite: 64-Bit-Kennungen als Zeichenketten senden. Jede API, die das einmal erwischt hat, tut das heute.

Wann Sie zu etwas anderem greifen sollten

Diese Seite dient dazu, ein Dokument zu lesen und zu reparieren, das Sie vor sich haben. Für zwei benachbarte Aufgaben ist sie das falsche Werkzeug:

  • Abfragen und Umformen. Dafür gibt es jq auf der Kommandozeile, das zudem streamt, statt alles in den Speicher zu laden — die richtige Antwort für alles jenseits weniger Megabyte.
  • Eine Form erzwingen. Das ist JSON Schema, und Struktur zu prüfen ist eine andere Frage als Syntax zu prüfen. Ein Dokument kann tadellos wohlgeformt sein und trotzdem jedes Feld vermissen lassen, das Ihre API verlangt.

Verwandt

Kam das JSON Base64-kodiert an, dekodieren Sie es zuerst. Stammt es aus einem Token, zerlegt und parst der JWT-Decoder beide Segmente für Sie. Und soll es in eine URL, zeigt der URL-Encoder, welche der drei Maskierungsregeln Sie brauchen.

Fragen zu JSON

Warum scheitert mein JSON, obwohl es richtig aussieht?

Vier Ursachen decken fast alles ab. Ein Komma vor der schließenden Klammer, das JavaScript akzeptiert und JSON nicht. Einfache statt doppelte Anführungszeichen. Kommentare, für die JSON überhaupt keine Syntax hat. Und Schlüssel ohne Anführungszeichen — {name: "x"} ist gültiges JavaScript und ungültiges JSON. Der Validator oben benennt, welche davon er gefunden hat, statt die Fehlermeldung des Parsers zu wiederholen.

Kann ich hier bedenkenlos Produktionsdaten einfügen?

In diese Seite ja — sie wird im Browser geparst, und es gibt keine Anfrage, die sie forttragen könnte. Sie können das prüfen, indem Sie beim Tippen den Netzwerk-Tab beobachten. Die Gewohnheit lohnt sich trotzdem allgemein: Das JSON, das Leute debuggen, ist meist eine echte API-Antwort mit echten Kundendatensätzen, und etliche Online-Formatierer schicken es zur Verarbeitung an einen Server. Prüfen Sie das vor dem Einfügen — bei jedem Werkzeug.

Kann JSON Kommentare enthalten?

Nein. Douglas Crockford hat sie bewusst entfernt, weil man begonnen hatte, Parser-Anweisungen hineinzuschreiben. Braucht eine Konfigurationsdatei Kommentare, sind die üblichen Antworten JSON5 oder JSONC (das VS Code nutzt) oder eine Konvention — ein Schlüssel "_comment", den die Verarbeiter ignorieren. Nichts davon ist JSON, ein strenger Parser weist es also weiterhin ab.

Was macht „Schlüssel sortieren“ und wann brauche ich das?

Es ordnet die Schlüssel jedes Objekts rekursiv alphabetisch. JSON-Objekte sind laut Spezifikation ungeordnet, zwei Dokumente, die sich nur in der Schlüsselreihenfolge unterscheiden, sind also gleichwertig — ein Text-Diff zeigt aber jede Zeile als geändert. Sortiert man beide vor dem Vergleich, bleibt genau das übrig, worauf es ankommt.

Gibt es eine Größenbeschränkung?

Nur die Ihres Browsers. Geparst wird auf der Seite selbst, ein paar Megabyte sind auf einem Desktop also unproblematisch und bringen ein älteres Telefon ins Schwitzen. Sehr große Dokumente handhabt man besser mit jq auf der Kommandozeile: Es streamt, statt den ganzen Baum im Speicher zu halten.

Warum kommt meine große Ganzzahl falsch zurück?

Weil JSON-Zahlen zu JavaScript-Zahlen werden, also zu IEEE-754-Doubles, und die verlieren oberhalb von 2⁵³ — rund 9,007 Billiarden — an Genauigkeit. Eine 19-stellige ID im Twitter-Stil oder ein bigint aus der Datenbank kommt subtil verändert zurück. Das ist kein Fehler des Formatters; es ist der Grund, warum APIs mit 64-Bit-IDs diese als Zeichenketten übertragen.

Zuletzt geprüft . Etwas veraltet gefunden? Sagen Sie uns Bescheid.