Entwicklertools · JSON Formatierer und Validator
Unsichtbare Zeichen, die JSON beschädigen: Stückliste, Anführungszeichen und NBSP
· Wie es funktioniert
json Entwickler-Workflow Validierung
Wenn der Prüfer beim allerersten Zeichen einen Fehler meldet und die Datei perfekt aussieht, ist normalerweise ein unsichtbares Zeichen schuld. In diesem Beitrag werden Byte-Reihenfolgemarkierungen, typografische Anführungszeichen und geschützte Leerzeichen erläutert und wie diese jeweils gemeldet werden.
Zeile 1, Spalte 1, nichts Falsches zu sehen
Zeile 1, Spalte 1, nichts Falsches zu sehen – ein JSON-Dokument kann mit einem Zeichen beginnen, das eine echte Position einnimmt, aber ohne sichtbare Glyphe gerendert wird. Die öffnende geschweifte Klammer scheint dann die erste zu sein, auch wenn davor eine Bytereihenfolgemarkierung oder ein Zeichen mit der Breite Null steht. Ein strikter Parser findet diesen versteckten Codepunkt, bevor er `{` erreicht, sodass die Meldung der ersten Spalte genau und nicht vage ist. Die Darstellung und die Zeichensequenz erzählen einfach unterschiedliche Geschichten.
Löschen Sie keine geschweifte Klammer, die korrekt aussieht, nur weil die Einfügemarke daneben erscheint. Überprüfen Sie den Codepunkt am gemeldeten Offset, aktivieren Sie sichtbare Leerzeichen oder wechseln Sie zu einer hexadezimalen Ansicht. ToolAcre entfernt eine führende Stückliste vor dem Parsen nicht stillschweigend und sein Scanner meldet das erste unerwartete Zeichen.
Die Bytereihenfolgemarkierung UTF-8
Die Bytereihenfolgemarkierung UTF-8 – die Bytesequenz EF BB BF dekodiert zu U+FEFF am Anfang einer Datei. Die Bytereihenfolge ist in UTF-8 nicht mehrdeutig, daher ist die Markierung unnötig, aber einige Editoren und Exporttools fügen sie dennoch als Codierungssignatur hinzu. RFC 8259 besagt, dass JSON-Generatoren keine Stückliste zu vernetzten JSON hinzufügen dürfen, obwohl Parser sich aus Gründen der Interoperabilität dafür entscheiden können, eine Stückliste zu ignorieren. Diese Toleranz kann nicht für alle Tools angenommen werden.
In einer JavaScript-Zeichenfolge besteht die Stückliste aus einem Zeichen, obwohl ihre Darstellung UTF-8 drei Bytes verwendet. ToolAcre meldet Positionen in Zeichenfolgenzeichen, sodass in Zeile 1, Spalte 1 eine führende Markierung erscheint. Konfigurieren Sie den Editor so, dass er UTF-8 ohne BOM speichert oder U+FEFF entfernt, bevor Sie die Datei verteilen.
Intelligente Zitate aus Textverarbeitungsprogrammen
Intelligente Zitate aus Textverarbeitungsprogrammen – typografische Anfangs- und Schlusszeichen sehen in Prosa elegant aus, aber JSON erkennt nur das ASCII-Anführungszeichen U+0022 als Zeichenfolgentrennzeichen. U+201C und U+201D sind gewöhnliche Unicode-Zeichen. Außerhalb einer Zeichenfolge dürfen sie weder mit einem Eigenschaftsnamen noch mit einem Eigenschaftswert beginnen, sodass der Validator das intelligente Anführungszeichen selbst meldet. Durch die automatische Korrektur im Chat, per E-Mail oder in einem Dokumenteneditor wird die Änderung häufig eingeführt, nachdem JSON ursprünglich gültig war.
Ersetzen Sie Trennzeichen durch gerade doppelte Anführungszeichen und untersuchen Sie dann Apostrophe und Anführungszeichen, die zum Wert gehören. Geschweifte Anführungszeichen sind als Inhalt innerhalb einer korrekt getrennten JSON-Zeichenfolge völlig zulässig, z. B. `"She said “go”"`; Sie scheitern nur, wenn sie aufgefordert werden, die grammatikalische Aufgabe des Trennzeichens auszuführen.
Geschützte Leerzeichen und Zeichen mit der Breite Null
Geschützte Leerzeichen und Zeichen mit der Breite Null – JSON Leerzeichen ist eine bewusst kurze Liste: gewöhnliches Leerzeichen U+0020, Tab U+0009, Zeilenvorschub U+000A und Wagenrücklauf U+000D. Ein geschütztes Leerzeichen U+00A0 sieht möglicherweise genauso aus wie ein normales Leerzeichen zwischen einem Doppelpunkt und einem Wert, steht aber nicht auf dieser Liste. Ein Leerzeichen mit der Breite Null U+200B zeigt überhaupt nichts an, bleibt aber ein unerwartetes Zeichen außerhalb einer Zeichenfolge in Anführungszeichen.
Webseiten verwenden geschützte Leerzeichen, um Wörter zusammenzuhalten, und Nachrichtensysteme fügen möglicherweise Zeichen mit der Breite Null zum Umbrechen oder zur Skriptverarbeitung ein. Durch Kopieren formatierter Snippets können diese in die Konfiguration übernommen werden. Ersetzen Sie strukturelle NBSP-Zeichen durch normale Leerzeichen und entfernen Sie unbeabsichtigte Zeichen mit der Breite Null, basierend auf dem gemeldeten Offset.
Funktioniertes Beispiel: eine aus einer Chat-Nachricht kopierte Konfiguration
Funktioniertes Beispiel: eine aus einer Chat-Nachricht kopierte Konfiguration – angenommen, der sichtbare Text ähnelt `{"mode": "safe"}`, aber die Validierung schlägt zu Beginn fehl. Eine Hex-Ansicht zeigt EF BB BF vor der Klammer. Durch das Entfernen dieser Stückliste wird der nächste Bericht zum Angebot vor `mode` verschoben, was eigentlich U+201C ist. Durch Ersetzen beider intelligenter Trennzeichen durch U+0022 wird dann ein U+00A0 zwischen dem Doppelpunkt und dem Wert angezeigt.
Ändern Sie dieses strukturelle geschützte Leerzeichen in U+0020 und validieren Sie es erneut. Das akzeptierte Ergebnis kann nun normal formatiert werden. Diese Sequenz zeigt, warum es unzuverlässig ist, nur das zu reparieren, was auf dem Bildschirm scheinbar angezeigt wird: Mehrere unsichtbare oder ähnliche Zeichen können unterschiedliche grammatikalische Positionen einnehmen. Folgen Sie jeder Zeile und Spalte, identifizieren Sie den tatsächlichen Codepunkt, nehmen Sie eine absichtliche Ersetzung vor und führen Sie die Validierung erneut aus.
Wie man das Unsichtbare sieht
So sehen Sie das Unsichtbare – aktivieren Sie die Render-Whitespace-Option eines Editors, um Tabulatoren von Leerzeichen zu unterscheiden und ungewöhnliche Lücken aufzudecken, und verwenden Sie dann einen Unicode-Inspektor oder eine Hex-Ansicht für Zeichen, die immer noch identisch aussehen. Eine UTF-8 BOM erscheint als EF BB BF, ein geschütztes Leerzeichen als C2 A0 und ein Leerzeichen mit der Breite Null als E2 80 8B. Intelligente Eröffnungs- und Schlusszitate werden als E2 80 9C und E2 80 9D angezeigt.
Passen Sie vor dem Zählen das Koordinatensystem der Diagnose an. ToolAcre scannt einen JavaScript-String, sodass seine Spalten UTF-16-Codeeinheiten statt UTF-8 Bytes zählen. Ein byteorientierter Hex-Editor kann daher nach Nicht-ASCII-Zeichen einen größeren numerischen Offset anzeigen. Verwenden Sie die gemeldete Zeile, um die Suche einzugrenzen, die benachbarten Codepunkte zu überprüfen und nur bei Bedarf zu übersetzen.
Was dies nicht abdeckt
Was dies nicht abdeckt – Mojibake wie `café` kann vollständig gültig sein JSON. Der Parser sieht eine gewöhnliche Folge von Zeichenfolgenzeichen und hat keinen Hinweis darauf, dass UTF-8 Bytes zuvor als eine andere Codierung dekodiert wurden. Ebenso ist ein geschütztes Leerzeichen oder ein Zeichen mit der Breite Null innerhalb eines in Anführungszeichen gesetzten Werts syntaktisch gültig. Die Validierung fängt Zeichen ab, die gegen die Grammatik von JSON verstoßen. Es kann nicht entscheiden, ob gültige Unicode-Inhalte der Absicht des Autors entsprechen.
Reparieren Sie Kodierungsfehler an der Grenze, an der Bytes zu Text werden, indem Sie die Kenntnis der ursprünglichen und fehlerhaften Kodierungen nutzen. Kodieren und dekodieren Sie eine JSON-Zeichenfolge nicht wiederholt, bis sie besser aussieht, da dies bereits korrekte Zeichen beschädigen kann. Die Normalisierung auf Anwendungsebene ist ebenfalls eine separate Entscheidung: Visuell identische Unicode-Sequenzen können unterschiedlich verglichen werden, bleiben aber gültig.
Takeaway: Vertrauen Sie der gemeldeten Spalte, auch wenn die Zeile sauber aussieht
Fazit: Vertrauen Sie der gemeldeten Spalte, auch wenn die Zeile sauber aussieht – unsichtbare Zeichen und ähnliche Satzzeichen nehmen immer noch präzise Positionen in der Quelle ein. Eine führende Stückliste, ein geschweiftes Trennzeichen, ein geschütztes Leerzeichen oder eine Markierung mit der Breite Null können verhindern, dass ein Parser die Klammer oder das Anführungszeichen erreicht, das korrekt erscheint. Zeigen Sie Leerzeichen auf, überprüfen Sie Codepunkte oder Bytes und ersetzen Sie das Zeichen, dessen Identität im Widerspruch zu seiner grammatikalischen Rolle steht, anstatt in der Nähe sichtbare JSON nach dem Zufallsprinzip zu bearbeiten.
Denken Sie daran, dass Positionen möglicherweise Zeichen zählen, während ein Hex-Tool codierte Bytes zählt. Vergleichen Sie daher den umgebenden Text, anstatt zu erwarten, dass jede Offset-Nummer übereinstimmt. Entfernen Sie eine Stückliste nur an der Dokumentgrenze, konvertieren Sie intelligente Trennzeichen in U+0022 und ersetzen Sie ungültige Strukturabstände, ohne legitimen Unicode innerhalb von Zeichenfolgen zu löschen.