JSON-Formatierer
Validiert ein vollständiges UTF-8-JSON-Dokument und schreibt nur die Leerzeichen neu, die JSON als unbedeutend definiert. Die lesbare und minimierte Ausgabe behält die Schlüsselreihenfolge, doppelte Namen, Zeichenfolgen-Escapezeichen und jedes ursprüngliche Zahlentoken bei.
Ein UTF-8-JSON-Dokument mit bis zu 25 MB. Seine Bytes bleiben in diesem Browser-Tab.
Die Ergebnisse werden ohne Gewähr für ihre Richtigkeit bereitgestellt. Die Methode und ihre Quellen stehen unten, damit Sie den Rechenweg prüfen können.
So funktioniert es
Was das bringt
JSON sieht einfach aus, bis ein Formatierer Daten ändert, die nie interpretiert werden sollten. Die übliche Abkürzung ist JSON.stringify(JSON.parse(file)). Das erzeugt eine ordentliche Ausgabe, leitet aber auch jede Zahl durch JavaScripts Binary64 Number, reduziert doppelte Objektnamen auf einen Wert und wählt neue Escape- und Exponentenschreibweisen.
Dieses Tool trennt Validierung vom Umschreiben. Der JSON-Parser des Browsers beweist, dass die vollständige Quelle ein konformer Wert ist. Ein zweiter, bewusst kleinerer Scanner kopiert die Original-Tokens und verändert nur die Leerzeichen, die laut RFC 8259 unbedeutend sind.
Die Methode
RFC 8259 definiert einen JSON-Text als Leerzeichen, einen Wert und dann Leerzeichen. Ein Wert kann ein Objekt, ein Array, eine Zahl, eine Zeichenfolge, true, false oder null sein. Die einzigen Leerzeichen in der Grammatik sind Leerzeichen, Tabulatorzeichen, Zeilenvorschub und Wagenrücklauf und sie sind in der Nähe von sechs Strukturzeichen zulässig:
[ ] { } : ,
Dadurch erhält der Formatierer eine schmale Bearbeitungsoberfläche. Außerhalb einer Zeichenfolge in Anführungszeichen können diese vier Leerzeichen entfernt werden. Innerhalb einer Zeichenfolge stellt ein Leerzeichen Daten dar, und ein Backslash bestimmt, ob das nächste Anführungszeichen die Zeichenfolge beendet oder Teil davon ist. Der Scanner behält daher zwei Statusbits bei: innerhalb einer Zeichenfolge und das vorherige Zeichen war ein Escapezeichen.
Der lesbare Modus fügt eine neue Zeile und einen Einzug nach einem nicht leeren {, [ oder Komma, ein einzelnes Leerzeichen nach einem Doppelpunkt und eine neue Zeile vor einem nicht leeren schließenden Container ein. Der minimierte Modus fügt nichts ein. Keiner der Modi wandelt ein primitives Token in einen Sprachwert um.
Vor dem Weiterlesen
Welcher Formatierer ist für die JSON-Nummer 9007199254740993 sicher?
Validieren Sie das Dokument und übernehmen Sie dann den ursprünglichen Nummern-Token in die Ausgabe. RFC 8259 ermöglicht Implementierungen zur Einschränkung der numerischen Genauigkeit und identifiziert den interoperablen Bereich für exakte Ganzzahlen um 2^53; Ein Leerraumformatierer muss diese Genauigkeit überhaupt nicht aufwenden.
Ein gelungenes Beispiel
Die einzeilige Quelle lautet:
{"invoice":9007199254740993,"notes":"keep two spaces","items":[true,null]}
Mit Lesbar und 2 Leerzeichen lautet die heruntergeladene Datei genau:
{
"invoice": 9007199254740993,
"notes": "keep two spaces",
"items": [
true,
null
]
}
Die beiden Leerzeichen innerhalb von "keep two spaces" bleiben Daten. Die große Rechnungsnummer behält ihre ursprünglichen Ziffern. Die tiefste Verschachtelung ist 2: Das Stammobjekt ist Ebene 1 und sein Array ist Ebene 2. Der Formeltest bestätigt die vollständigen Ausgabebytes, den Dateinamen, MIME, die Byteanzahl und die Tiefe, die im Ergebnisfenster angezeigt werden.
Warum Nummerntext und Objektreihenfolge unangetastet bleiben
RFC 8259 erlaubt Zahlengrößen und -genauigkeiten, die über das hinausgehen, was Binary64 aufnehmen kann, wobei darauf hingewiesen wird, dass ganze Zahlen von -(2^53)+1 bis (2^53)-1 die Bereichsimplementierungen sind, über die man sich im Allgemeinen genau einig ist. Ein Formatierer, der 9007199254740993 in Binär64 analysiert, schreibt möglicherweise 9007199254740992. Das Entfernen eines Zeilenumbruchs erforderte diese Konvertierung nie, daher führt dieses Tool sie nicht durch.
Der RFC sagt außerdem, dass Objektnamen eindeutig sein sollten, und dokumentiert dann, was passiert, wenn dies nicht der Fall ist: Einige Parser behalten den letzten Wert, andere schlagen fehl und andere legen alle Duplikate offen. Es wird außerdem darauf hingewiesen, dass sich Bibliotheken darin unterscheiden, ob die Reihenfolge der Mitglieder sichtbar ist. Sortieren oder Deduplizieren kann in einem speziellen Datenbereinigungs-Workflow nützlich sein, aber beides ist unter einer Schaltfläche mit der Bezeichnung Format nicht ehrlich.
Was es nicht tut
Es repariert kein ungültiges JSON, zitiert keine bloßen Objektnamen, entfernt keine Kommentare, akzeptiert keine nachgestellten Kommas, sortiert keine Schlüssel und konvertiert kein JSON5. Diese Vorgänge erfordern eine Richtlinie für mehrdeutige Eingaben. Hier werden fehlerhafte Eingaben gemeldet und die Originaldatei bleibt unberührt.
Es ändert auch nicht die Zeichenkodierung. Interoperables JSON ist UTF-8, und ein anfängliches UTF-8-BOM wird nur akzeptiert, weil RFC 8259 Parsern erlaubt, eines aus Kompatibilitätsgründen zu ignorieren. Um bekannten UTF-16-Klartext wiederherzustellen, konvertieren Sie zunächst die Bytes. Bitten Sie einen JSON-Formatierer nicht, zu erraten, welche Zeichen sie bedeuten.
So wird es gemacht
- Lesen Sie die Datei als striktes UTF-8. Akzeptieren und nutzen Sie aus Kompatibilitätsgründen eine anfängliche UTF-8-Bytereihenfolgemarkierung, schreiben Sie jedoch keine in das Ergebnis.
- Validieren Sie das gesamte Dokument als einen RFC 8259-JSON-Wert, bevor Sie ein Artefakt erstellen. Lehnen Sie eine leere Datei, ungültiges UTF-8, nachgestellte Inhalte oder fehlerhafte Objekte, Arrays, Zeichenfolgen, Zahlen und Literalnamen ab.
- Scannen Sie die validierte Quelle und verfolgen Sie dabei Zeichenfolgen in Anführungszeichen und Backslash-Escapezeichen. Kopieren Sie innerhalb einer Zeichenfolge jede Codeeinheit genau. Verwerfen Sie außerhalb einer Zeichenfolge nur Leerzeichen, Tabulatorzeichen, Wagenrücklauf und Zeilenvorschub.
- Für eine lesbare Ausgabe fügen Sie den ausgewählten Einzug nach einem öffnenden Container und Komma, ein Leerzeichen nach einem Doppelpunkt und eine korrekt eingerückte Zeile vor einem nicht leeren schließenden Container ein. Für eine minimierte Ausgabe fügen Sie kein optionales Leerzeichen ein.
- Kodieren Sie den umgeschriebenen Text als UTF-8, fügen Sie nur bei Auswahl einen letzten Zeilenvorschub hinzu und bieten Sie eine neue .json-Datei an. Analysieren Sie Zahlentokens für die Ausgabe niemals in Gleitkommawerte.
Wovon es ausgeht
- Formatierung ist keine Kanonisierung. Die Reihenfolge der Objektmitglieder, doppelte Namen, die Schreibweise von Zahlen und die Auswahl von Zeichenfolgen-Escapes bleiben unverändert, selbst wenn ein anderer Parser sie normalisieren oder reduzieren könnte.
- JSON, das zwischen unabhängigen Systemen ausgetauscht wird, ist UTF-8 gemäß RFC 8259. UTF-16 und ältere Codepages gehören in den separaten Textkodierungskonverter, bevor diese Grammatik angewendet wird.
- Der native JSON-Parser wird nur als strenger Grammatikvalidator verwendet. Die herunterladbaren Bytes stammen aus einem tokenerhaltenden Scan des Originaltextes, nicht aus JSON.stringify.
- Die Eingabe ist auf 25 MB begrenzt. Das Umschreiben ergibt alle 250.000 Zeichen, sodass Fortschritt und Abbrechen weiterhin reaktionsfähig bleiben. Die native Validierung selbst wird bewusst dem optimierten Parser des Browsers überlassen.
Fragen
Verlässt die JSON-Datei dieses Gerät, während sie formatiert wird?
Nein. Die strikte Dekodierung, Grammatikvalidierung, das Umschreiben von Leerzeichen und die Dateierstellung erfolgen in einem Worker in diesem Browser-Tab. Der generierte Browsertest liefert eine echte JSON-Datei und schlägt fehl, wenn die Verwendung des Tools eine Off-Origin-Anfrage sendet.
Kann die Formatierung eine ganze Zahl runden, die größer ist, als JavaScript genau darstellen kann?
Nicht hier. Der Validator überprüft möglicherweise die Grammatik, aber der Autor kopiert die ursprünglichen Zahlenzeichen, anstatt eine JavaScript-Zahl zu serialisieren. Eine Ganzzahl wie 9007199254740993 behält daher jede Ziffer.
Werden doppelte Objektnamen entfernt?
Nein. RFC 8259 empfiehlt eindeutige Namen für die Interoperabilität, beschreibt jedoch inkonsistentes Parserverhalten, wenn Duplikate vorhanden sind. Dieser Formatierer behält jedes Element in seiner ursprünglichen Reihenfolge bei, sodass die Formatierung diese Produktentscheidung nicht stillschweigend trifft.
Entfernt die Minimierung Leerzeichen oder Zeilenumbrüche innerhalb einer Zeichenfolge?
Nein. Eine in Anführungszeichen gesetzte Zeichenfolge wird nach der UTF-8-Dekodierung Byte für Byte kopiert, einschließlich gewöhnlicher Leerzeichen und Escape-Steuerzeichen. Nur die vier JSON-Leerzeichen außerhalb einer Zeichenfolge sind optional.
Wird der Formatierer Schlüssel sortieren oder kanonisches JSON erstellen?
Nein. Die Sortierung ändert die Reihenfolge der Mitglieder und die Kanonisierung ändert auch die Schreibweise der Token. Dieses Tool hat nur ein einziges Versprechen: Validieren Sie das Dokument und ändern Sie nur unbedeutende Leerzeichen.