JSON-Validator
Jeder Fehler mit exakter Zeile, Spalte, Ursache und Lösung.
Nichts, was Sie einfügen, verlässt Ihren Browser. Die connect-src Erlaubnisliste macht daraus eine Garantie des Browsers statt eines Versprechens. Selbst überprüfen
Validierung beantwortet genau eine Frage: Ist das ein zulässiges JSON-Dokument? Nützlich wird es, wenn die Antwort nein lautet. Die meisten Validatoren sagen Ihnen, ein Token sei unerwartet gewesen, und überlassen Ihnen die Suche. Dieser nennt das Zeichen, die Zeile und die Spalte, was stattdessen erwartet wurde und was zu tun ist.
Er hört auch nicht beim ersten Problem auf. Ein Dokument mit vier Fehlern meldet vier Fehler, sodass Sie sie in einem Durchgang beheben statt in vier.
Was geprüft wird
Die Grammatik von RFC 8259, vollständig. Einschließlich der Teile, die überraschen.
- Leerraum
- Zwischen Tokens sind genau vier Zeichen erlaubt: Leerzeichen, Tabulator, Wagenrücklauf und Zeilenvorschub. Ein geschütztes Leerzeichen, ein Zero-Width-Space oder ein ideographisches Leerzeichen ist ein Syntaxfehler, und dieser Validator benennt das Zeichen, statt ein unerwartetes Token zu melden. Solche Zeichen entstehen ständig beim Kopieren von JSON aus einer Webseite, einem PDF oder einem Chat-Client.
- Zahlen
- Keine führenden Nullen, kein führendes Plus, kein Hexadezimal, kein abschließender Dezimalpunkt, kein NaN und kein Infinity. Jeder Verstoß bekommt eine eigene Meldung, weil jeder eine andere Ursache und eine andere Lösung hat.
- Zeichenketten
- Nur neun Escape-Sequenzen sind zulässig. Steuerzeichen unter U+0020 müssen escapt werden. Einzelne Surrogate werden als Warnung markiert, weil sie zwar geparst werden, ein erneutes Kodieren nach UTF-8 aber nicht überstehen.
- Ein Wert auf oberster Ebene
- Ein Dokument enthält genau einen. Mehrere Werte, einer pro Zeile, ist NDJSON, und dieser Validator erkennt diese Form und sagt das, statt einen allgemeinen Fehler über überschüssigen Inhalt zu melden.
Warnungen, die keine Fehler sind
Manches lässt sich parsen und ruiniert Ihnen trotzdem den Nachmittag. Es wird getrennt gemeldet, damit es die Ausgabe nie blockiert.
- Doppelte Schlüssel
- RFC 8259 sagt, Schlüssel SOLLTEN eindeutig sein, und lässt das Verhalten offen, wenn sie es nicht sind. JavaScript und Python behalten den letzten, manche Go- und Java-Parser lehnen das Dokument ab, einige wenige behalten den ersten. Sie bekommen beide Positionen.
- Ganzzahlen außerhalb des sicheren Bereichs
- Oberhalb von 2^53-1 kann eine JavaScript-Zahl den Wert nicht exakt halten. Die Warnung nennt den Wert, den JSON.parse Ihnen stattdessen liefern würde.
- Ein Byte Order Mark
- Ein führendes U+FEFF wird hier akzeptiert und gemeldet, weil JSON.parse in Browsern und in Node es rundheraus ablehnt.
- Sehr tiefe Verschachtelung
- Dieser Parser arbeitet iterativ und hat keine Tiefenbegrenzung, viele Konsumenten aber schon. Auf dieser Maschine gemessen weigert sich V8, eine Struktur mit mehr als etwa 4.800 Ebenen zu serialisieren - ein Dokument, das Sie lesen können, kann also trotzdem eines sein, das Sie nicht wieder herausschreiben können.
Nicht nur Syntax, sondern auch Gestalt prüfen
Die Syntaxprüfung sagt nur, dass das Dokument wohlgeformt ist, nicht dass es enthält, was Sie erwartet haben. Dafür brauchen Sie JSON Schema, das erforderliche Eigenschaften, Typen und Einschränkungen beschreibt. Unser Schema-Generator erzeugt aus einem Beispiel-Payload einen Ausgangspunkt.
How to do this in code
Gültigkeit im Code prüfen - und einen brauchbaren Fehler daraus bekommen.
js JavaScript
In der Standardbibliothek gibt es keinen Validator ohne Exception, also ist das try/catch die API.
function validate(text) {
try {
JSON.parse(text);
return { ok: true };
} catch (e) {
// Modern V8 includes a (line L column C) suffix in the message.
return { ok: false, message: e.message };
}
} py Python
JSONDecodeError trägt msg, lineno, colno, pos und doc - mehr Struktur, als die meisten Laufzeitumgebungen liefern.
import json
try:
json.loads(text)
except json.JSONDecodeError as e:
print(f"{e.msg} at line {e.lineno} column {e.colno} (char {e.pos})") sh Shell
jq empty parst die Eingabe und gibt nichts aus, was daraus eine saubere Gültigkeitsprüfung in einem CI-Skript macht.
# jq exits non-zero and prints the position on failure
jq empty input.json
# Python, no extra install
python -m json.tool input.json > /dev/null go Go
Go meldet einen Byte-Offset statt einer Zeile, die Zeilenumbrüche müssen Sie also selbst zählen.
if !json.Valid(data) {
// Valid() gives no position. To get one, decode and
// inspect the SyntaxError:
var v any
if err := json.Unmarshal(data, &v); err != nil {
var se *json.SyntaxError
if errors.As(err, &se) {
line := 1 + bytes.Count(data[:se.Offset], []byte("\n"))
return fmt.Errorf("%v at line %d", se, line)
}
}
} Häufige Fragen
- Warum meldet das Werkzeug mehrere Fehler, wo andere Validatoren einen melden?
- Weil der Parser sich erholt, statt anzuhalten. Nach einer Meldung synchronisiert er sich neu und macht weiter: Ein Dokument mit einem Komma am Ende, einer Zeichenkette in einfachen Anführungszeichen und einem Schlüssel ohne Anführungszeichen meldet alle drei in einem Durchgang.
- Ist eine einzelne Zeichenkette oder Zahl für sich gültiges JSON?
- Ja, seit RFC 7159 im Jahr 2014. Die ursprüngliche RFC 4627 verlangte auf oberster Ebene ein Objekt oder ein Array; die heutige Spezifikation, RFC 8259, erlaubt jeden Wert. "hallo", 42 und null sind also vollständige, gültige JSON-Dokumente.
- Sind Kommas am Ende jemals erlaubt?
- In JSON nicht. In JavaScript, in JSON5 und in JSONC schon - Letzteres verwendet VS Code für seine eigenen Einstellungsdateien. Wenn Ihr Konsument JSONC akzeptiert, können Sie sie behalten; sonst entfernt das Reparaturwerkzeug sie.
- Und Kommentare?
- JSON hat bewusst keine. Douglas Crockford hat sie absichtlich entfernt, mit der Begründung, dass Leute sie für Parser-Anweisungen benutzten. Verwenden Sie JSONC oder JSON5, oder verschieben Sie die Notiz in einen Schlüssel wie "_comment".