Deutsch

Entwicklertools · JSON Formatierer und Validator

JavaScript-Objektliterale vs. JSON: Warum einfache Anführungszeichen bei der Validierung fehlschlagen

· Wie es funktioniert

json Entwickler-Workflow Validierung

JavaScript-Objektliterale vs. JSON: Warum einfache Anführungszeichen bei der Validierung fehlschlagen, veranschaulicht mit JSON-Tokens und einer präzisen Validierungsgrenze
Original-ToolAcre-Vektorillustration

Ein von einer JavaScript-Konsole gedrucktes Objekt sieht aus wie JSON, ist es aber normalerweise nicht. Dieser Beitrag listet die genauen Unterschiede auf (Anführungszeichen, Schlüssel ohne Anführungszeichen, undefiniert, Funktionen) und zeigt, wo jeder einzelne einen Validator auslöst.

Es kam aus der Konsole. Warum ist es ungültig?

Es kam aus der Konsole. Warum ist es ungültig? – Entwicklerkonsolen zeigen JavaScript-Werte als JavaScript-Quelltext an, nicht als garantierte JSON-Serialisierung. Ein kopiertes Objekt kann bloße Eigenschaftsnamen, Zeichenfolgen in einfachen Anführungszeichen, `undefined` oder browserspezifische Anmerkungen enthalten. All dies kann für eine JavaScript-Engine oder einen menschlichen Leser verständlich sein, während es sofort in einer `.json`-Datei fehlschlägt, deren Grammatik absichtlich kleiner und unabhängig vom ausführbaren Code ist.

Betrachten Sie `{name: "Ada", active: true, missing: undefined}`. Die geschweiften Klammern, der Doppelpunkt und der boolesche Wert ähneln JSON, aber der erste bloße Schlüssel verstößt bereits gegen die Objektmitgliedsregel und `undefined` würde später fehlschlagen. ToolAcre meldet das erste nicht unterstützte Zeichen oder den ersten nicht unterstützten Wert mit einer Zeile und einer Spalte, daher erfolgt die Konvertierung am besten der Reihe nach.

Zeichenfolgen müssen doppelte Anführungszeichen verwenden

Zeichenfolgen müssen doppelte Anführungszeichen verwenden – JSON definiert eine Zeichenfolge als Zeichen, die von `"` eingeschlossen sind, mit Backslash-Escapezeichen, wo erforderlich. Ein einfaches Anführungszeichen spielt als Zeichenfolgentrennzeichen keine Rolle. Wenn ein Validator `'Ada'` erfüllt, beginnt er nicht mit einer Zeichenfolge und erhebt dann keinen Einspruch gegen deren Inhalt; es lehnt den einleitenden Apostroph selbst ab. Dies gilt gleichermaßen für Eigenschaftsnamen und Zeichenfolgenwerte, auch wenn JavaScript beide Anführungszeichen für seine eigenen Literale zulässt.

Das Konvertieren von Anführungszeichen erfordert mehr Sorgfalt als das globale Ersetzen jedes Apostrophs. Ein Apostroph innerhalb eines Textes wie `Ada's profile` ist gewöhnlicher Inhalt, sobald der Wert in doppelte Anführungszeichen gesetzt wird, während vorhandene doppelte Anführungszeichen innerhalb dieses Inhalts maskiert werden müssen. Das gültige JSON-Formular ist `"Ada's "profile""`.

Schlüssel müssen Zeichenfolgen in Anführungszeichen sein

Schlüssel müssen Zeichenfolgen in Anführungszeichen sein – JavaScript-Objektliterale erlauben Namen im Bezeichnerstil wie `{name: 1}` und berechnete Namen wie `{[expression]: 1}`. JSON erlaubt keine Kurzschrift. Nach einer öffnenden Klammer oder einem Komma muss das nächste Element mit einer Zeichenfolge in doppelten Anführungszeichen beginnen, gefolgt von einem Doppelpunkt. Die gültige Darstellung ist `{"name": 1}`. Ein Validator, der auf `n` zeigt, identifiziert die genaue Stelle, an der ein Angebot erforderlich war.

Das Zitieren jedes Schlüssels beseitigt auch Mehrdeutigkeiten bei Leerzeichen, Bindestrichen und reservierten Wörtern. JavaScript erfordert in diesen Fällen möglicherweise eine andere Quellsyntax, aber JSON verwendet eine einheitliche Regel: `"display-name"`, `"first name"` und `"default"` sind allesamt normale Mitgliedsnamen. Numerisch aussehende Tasten sind ebenfalls Zeichenfolgen.

Werte, die JSON einfach nicht hat

Werte, die JSON einfach nicht hat – sein Wertevokabular ist Objekt, Array, String, Zahl, `true`, `false` und `null`. Es gibt keine `undefined`, `NaN`, `Infinity`, Funktion, regulären Ausdruck, BigInt oder Date-Literal. Kommentare fehlen in der Grammatik und Zahlen können keine hexadezimalen, binären, führenden Pluszeichen oder numerischen JavaScript-Trennzeichen verwenden. Jedes geliehene Konstrukt erreicht schließlich ein Zeichen, das keinen gültigen JSON-Wert beginnen oder fortsetzen kann.

Die Konvertierung erfordert eine Datenentscheidung und keinen Rechtschreibtrick. Ersetzen Sie `undefined` nur dann durch `null`, wenn ein expliziter leerer Wert mit dem Anwendungsvertrag übereinstimmt. Andernfalls entfernen Sie das Mitglied oder geben Sie einen echten Wert an. Kodieren Sie Datumsangaben als vereinbarte Zeichenfolgen, häufig ISO 8601. Stellen Sie nicht endliche Zahlen gemäß der empfangenden API dar, anstatt ein JSON-Token zu erfinden.

Arbeitsbeispiel: Konvertieren eines Konsolen-Dumps in gültiges JSON

Arbeitsbeispiel: Konvertieren eines Konsolen-Dumps in gültiges JSON – beginnen Sie mit `{name: 'Ada', active: true, score: NaN, updated: new Date()}`. Zitieren Sie `name`, `active`, `score` und `updated` in doppelten Anführungszeichen. Ändern Sie den Namenswert in eine Zeichenfolge in doppelten Anführungszeichen. Entscheiden Sie, dass ein nicht verfügbarer Score `null` sein soll, und ersetzen Sie den Konstruktorausdruck durch die tatsächliche Zeitstempelzeichenfolge, die er erzeugen sollte. Das Dokument enthält jetzt nur noch JSON Mitglieder und Werte.

Die fertige Form könnte `{"name":"Ada","active":true,"score":null,"updated":"2026-03-21T10:00:00Z"}` sein. Führen Sie nach jeder Reparaturkategorie eine Validierung durch, da der erste Fehler die spätere Nur-JavaScript-Syntax verbergen kann. Durch die Formatierung des akzeptierten Ergebnisses wird dann dessen Struktur angezeigt, ohne dass eine weitere Konvertierung erforderlich ist.

Der umgekehrte Trap – gültiger JSON, den JavaScript anders lesen würde, z. B. sehr große Ganzzahlen und der Schlüssel __proto__

Der umgekehrte Trap – gültig JSON kann nach dem Parsen weiterhin JavaScript-spezifisches Verhalten oder Einschränkungen annehmen. Für JSON-Zahlen gibt es keine integrierte Genauigkeitsbeschränkung in der Grammatik, aber JSON.parse erzeugt JavaScript-Zahlenwerte. Eine Ganzzahl außerhalb des sicheren Bereichs kann daher stillschweigend gerundet werden. Wenn jede Ziffer wichtig ist, kodieren Sie den Bezeichner als Zeichenfolge oder verwenden Sie einen Parser und Datentyp, der darauf ausgelegt ist, Zahlen mit beliebiger Genauigkeit beizubehalten, anstatt auf eine erfolgreiche Syntaxprüfung zu vertrauen.

Der Mitgliedsname `"__proto__"` ist auch gültig JSON und JSON.parse erstellt ihn als eigene Dateneigenschaft. Probleme können später auftreten, wenn der Anwendungscode analysierte Eigenschaften in ein anderes Objekt mit unsicherem Zuweisungs- oder Zusammenführungsverhalten kopiert. Die Validierung beweist, dass der Text der JSON-Grammatik folgt; es beweist nicht, dass jeder Schlüssel für jeden Verbraucher sicher ist.

Was dies nicht abdeckt

Was dies nicht abdeckt – JSON5, JSONC und Konfigurationssprachen, die absichtlich Kommentare, nachgestellte Kommas, Namen ohne Anführungszeichen oder Zeichenfolgen in einfachen Anführungszeichen akzeptieren. Diese Formate lösen unterschiedliche Autorenprobleme und erfordern Parser, die ihre eigenen Grammatiken implementieren. Ein strenger JSON-Validator sollte sie nicht stillschweigend neu interpretieren, da das Akzeptieren zusätzlicher Syntax das Ergebnis für APIs, Paketmetadaten und andere Ziele, die tatsächlich Standard-JSON erfordern, irreführend machen würde.

Diese Unterscheidung schließt auch eine beliebige JavaScript-Auswertung aus. Wenn Sie eingefügten Text über `eval` oder einen Funktionskonstruktor ausführen, nur um ein Objektliteral in Daten umzuwandeln, können Getter, Aufrufe oder andere schädliche Ausdrücke ausgeführt werden. Wenn es sich bei der Quelle um vertrauenswürdiges JavaScript unter Ihrer Kontrolle handelt, serialisieren Sie den tatsächlichen Wert mit JSON.stringify. Wenn es sich bei der Quelle um nicht vertrauenswürdigen Text handelt, führen Sie ihn nicht aus.

Fazit: Ein Literal ist Code, JSON sind Daten

Fazit: Ein Literal ist Code, JSON sind Daten – visuelle Ähnlichkeit macht ihre Grammatiken nicht austauschbar. JSON erfordert Zeichenfolgen und Mitgliedsnamen in doppelten Anführungszeichen, lässt nur einen kleinen festen Satz von Werttypen zu und enthält keine Kommentare oder ausführbaren Ausdrücke. Eine Zeilen-und-Spalten-Diagnose markiert die erste Stelle, an der die kopierte Quelle diese Grammatik verlässt. Das Reparieren und erneute Validieren dieses Punkts ist zuverlässiger als die Anwendung eines umfassenden Suchens und Ersetzens auf einen Konsolen-Dump.

Wenn Sie den JavaScript-Wert steuern, generieren Sie JSON mit JSON.stringify, anstatt die Konsolendarstellung zu kopieren. Wenn Sie Text empfangen, analysieren Sie ihn nur mit dem Parser für das deklarierte Format und führen Sie ihn niemals als Verknüpfung aus. Eine erfolgreiche JSON-Validierung stellt die Syntax, nicht die numerische Genauigkeit, die Schemakonformität oder die sichere nachgelagerte Eigenschaftsverarbeitung her.