Die Aufgabe, die mich gelehrt hat, das Abflachen zu respektieren, sah auf dem Ticket langweilig aus: & quot; Exportieren Sie das Einstellungsobjekt in eine Tabellenkalkulation, damit der Client es bearbeiten kann. & quot; Die Einstellungen waren ein tief verschachtelter JSON-Blob aus einer Laravel-Konfiguration, drei und vier Ebenen tief an Orten, mit Arrays von Feature-Flags gemischt In einer Tabelle sind Spalten und keine Bäume ein Tabellenkalkulation. Ich brauchte jeden Blattwert als einen einzigen flachen Schlüssel, den der Kunde in einer Reihe sehen, bearbeiten und zurückgeben konnte, und dann musste ich die genaue verschachtelte Struktur aus seinen Bearbeitungen neu aufbauen, ohne einen einzigen Array-Index zu verlieren. Dieser Rundt, ist das Werkzeugverlust, das ist das ganze. JSON-Flattener Das Tool ist, das ich für diesen Job entwickelt habe, und dieser Leitfaden erklärt, wie es funktioniert und wo es Sie spart.
tl; dr: Ein JSON-Flattener wandelt ein verschachteltes Objekt in ein einstufiges Objekt um, dessen Schlüssel der Pfad zu jedem Wert sind
{"user":{"city":"Austin"}}wird{"user.city":"Austin"}. Arrays werden mit ihrem Index im Pfad abgeflacht (roles.0). Unflatten kehrt es um und baut die verschachtelten Objekte und Arrays aus diesen gepunkteten Tasten wieder auf. Das Toolz-Tool führt beide Richtungen verlustfrei aus, bewahrt leere Objekte und Arrays, unterstützt die Punkt- oder Klammerarray-Notation und einen benutzerdefinierten Trennzeichen und läuft vollständig clientseitig ohne Upload und ohne Anmeldung.
Ich baue SaaS auf Laravel und React und versende WordPress Plugins, so verschachteltes JSON ist überall in meiner Zeit: config-Dateien, API-Nutzlasten, i18 n-Nachrichtenkataloge, Feature-Flag-Speicher Die Systeme, die diese Nutzlasten verbrauchen, wollen jedoch häufig flache Schlüssel Das Flattening ist der Adapter zwischen einer Form, die für strukturierte Daten natürlich ist, und einer Form, die für Tabellenkalkulationen, Umgebungsvariablen und gepunktete Schlüsselspeicher natürlich ist Es ist eine kleine Operation, die leise viele ansonsten lästige Aufgaben entblockt.
Was ist ein JSON-Flattener?
Ein JSON-Flattener wandelt ein verschachteltes JSON-Objekt in ein Single-Level-Objekt um, bei dem jeder Schlüssel der vollständige Pfad von der Wurzel zu einem Blattwert ist Die Pfadsyntax ist auch nicht beliebig: RFC 6901 JSON Pointer definiert, die Standardmethode, um einen Wert innerhalb eines Dokuments anzusprechen Das verschachtelte {"user":{"name":"Ada","address":{"city":"Austin"}}} Flach wird {"user.name":"Ada","user.address.city":"Austin"}. An den Werten ändert sich nichts; nur ihre Adressierung tut es Jedes Blatt, so tief es auch sein mag, bekommt einen Schlüssel, der darlegt, wie man es erreicht.
Arrays werden auf die gleiche Weise gehandhabt, wobei der Array-Index zu einem Pfadsegment wird: {"roles":["admin","editor"]} Abflacht auf {"roles.0":"admin","roles.1":"editor"}. Der Index in der Taste ist es, der die umgekehrte Operation das Array in der richtigen Reihenfolge neu aufbauen lässt. Diese umgekehrte Operation nimmt, entflacht, ein flaches Objekt mit gepunkteten Schlüsseln und rekonstruiert die verschachtelten Objekte und Arrays, wobei bei jedem Schritt entschieden wird, ob ein Pfadsegment eine Objekteigenschaft oder einen Array-Index benennt. Wenn Abflachen und Entflachen dieselbe Trennzeichen- und Array-Notation verwenden, handelt es sich um exakte Umkehrungen, und diese verlustfreie Hin- und Rückfahrt ist die Eigenschaft, die das Werkzeug für echte Arbeit vertrauenswürdig macht, und nicht um eine einfache Bequemlichkeit.
Warum sollte ich JSON überhaupt platt machen?
Denn viele Systeme sprechen nur flache Schlüssel-Wert-Paare, und ein gepunkteter Pfad ist die Standardmethode, um verschachtelte Struktur durch sie zu tragen, ohne sie zu verlieren Das deutlichste Beispiel ist eine Tabellenkalkulation Eine Tabellenkalkulation ist ein Spaltenraster, und es gibt keine Spalte für & quot; die Stadt innerhalb der Adresse innerhalb des Benutzers." Das Objekt abflachen und user.address.city Wird zu einem einzelnen Spaltenkopf, unter dem der Wert leben kann, und genau das benötigte mein Einstellungen-Export-Ticket.
Die gleiche Form zeigt sich an vielen anderen Stellen Umgebungsvariablen und .env Dateien sind flach, und Werkzeuge, die ihnen config zuordnen, verwenden gepunktete oder unterstrichene Pfade Internationalisierungsbibliotheken geben ihre Zeichenfolgen mit gepunkteten Pfaden ein wie checkout.button.label. Feature-Flag-Plattformen, Analyse-Ereignisschemata und viele Protokollierungspipelines wünschen sich alle eine Ebene von Schlüsseln, oft damit sie jedes Feld unabhängig indizieren oder abfragen können. In jedem Fall ist die Verschachtelung real und sinnvoll, und durch das Abflachen bleibt sie im Pfad erhalten, anstatt sie zu verwerfen. Wenn die flache Darstellung ihren Zweck erfüllt hat, baut unflatten das ursprüngliche Objekt wieder auf. Wenn Sie sich speziell auch zwischen JSON und Tabellenkalkulationen bewegen, wird die CSV-zu-JSON-Konverter ist der natürliche Begleiter für die tabellarische Etappe dieser Reise.
Wie werden Arrays beim Abflachen gehandhabt?
Arrays sind der Teil, den Menschen am häufigsten falsch machen, daher lohnt es sich, präzise zu sein. Ein Array-Element wird mit seinem numerischen Index als Pfadsegment abgeflacht, was die Ordnung beibehält und es ermöglicht, das Array genau neu aufzubauen. Das Toolz-Tool bietet zwei Notationen für diesen Index und sie kodieren dieselben Informationen mit unterschiedlicher Syntax.
| Eingabe | Punktschreibweise | Klammerschreibweise |
|---|---|---|
{"roles":["admin","editor"]} |
roles.0, roles.1 |
roles[0], roles[1] |
{"items":[{"id":1}]} |
items.0.id |
items[0].id |
{"matrix":[[1,2]]} |
matrix.0.0 |
matrix[0][0] |
Punktnotation schreibt roles.0(die kompakt ist und dazu passt, wie viele config und i18 n-Systeme ihre Werte keyten Klammernotation schreibt roles[0]Die JavaScript-Zugriffssyntax und den Pfadstil, den einige Abfragesprachen verwenden, widerspiegelt, ist nicht korrekter; Sie wählen diejenige aus, die das System am anderen Ende erwartet. Wichtig ist Konsistenz: Verwenden Sie zum Entflachen dieselbe Notation, unabhängig davon, mit welcher Notation Sie sie abflachen, denn so kennt das Tool ein numerisches Segment & quot;array index" anstelle von & quot; eine Objekttaste, die zufällig eine Zahl ist." Der Toolz-Flattener verwendet standardmäßig die Punktnotation und ermöglicht Ihnen, mit einem Klick zur Klammer zu wechseln.
Wie verwende ich den JSON-Flattener?
Der Fluss hat zwei Richtungen und ein paar Optionen. Beginnen Sie damit, flach oder entflacht zu wählen, wobei der Knebel oben liegt. Flatten nimmt verschachteltes JSON und erzeugt gepunktete Schlüssel; Unflatten nimmt gepunktete Schlüssel und baut die verschachtelte Struktur neu auf. Load Sample füllt ein funktioniertes Beispiel für die Richtung, in die Sie sich befinden, sodass Sie die Form sowohl der Eingabe als auch der Ausgabe sehen können, bevor Sie Ihre eigenen Daten einfügen.
Fügen Sie Ihren JSON in das Eingabefeld ein Für platt, das ist ein verschachteltes Objekt; für unflatten, ist es ein flaches Objekt, dessen Schlüssel gepunktete Pfade sind Die Eingabe muss gültiges JSON sein, und wenn nicht, meldet das Tool die parser' s-Nachricht und die Position des Problems, anstatt Ihnen eine leere Ausgabe zu geben, so dass ein Streunendeckkomma schnell zu finden ist Legen Sie den Schlüsselstil fest: der Trennzeichener wird standardmäßig auf einen Punkt gesetzt und kann geändert werden, wenn Ihre Tasten bereits Punkte enthalten, und die Array-Notation umschaltet zwischen roles.0 und roles[0]. Halten Sie diese beiden Einstellungen über eine Abflachung hinweg identisch und ihre Übereinstimmung wird entflacht, damit die Hin- und Rückfahrt in einer Reihe steht. Klicken Sie auf die Aktionstaste, überprüfen Sie die Anzahl der Tasten, die bestätigen, wie viele Blätter produziert wurden, und kopieren Sie die Ausgabe oder laden Sie sie als herunter .json Datei. Das Ganze läuft in dem Moment, in dem Sie klicken, in Ihrem Browser, ohne dass etwas irgendwo gesendet wird.
Ist das Abflachen verlustfrei, und was sind die Randfälle?
Für das Toolz-Tool ja, mit einem wissenswerten Randfall Skalare, null‘Booleaner, und Zahlen überleben unberührtDer subtile Teil sind leere Behälter: ein leerer Gegenstand {} oder ein leeres Array [] Wird als Blattwert erhalten und nicht stillschweigend fallen gelassen, sodass eine Konfiguration, die auf einer leeren Liste basiert, immer noch genau zu dem hinreißt, was sie war. Viele naive Abflacher verlieren leere Behälter, was die Bedeutung eines Dokuments leise verändert, also ist dies eine bewusste Entscheidung.
Die eine echte Einschränkung sind Schlüssel, die bereits das Trennzeichen enthalten Wenn Ihre Daten einen Objektschlüssel mit einem wörtlichen Punkt darin haben, wie {"a.b":1}Wenn Sie mit einem Punktbegrenzer abflachen, wird der Weg mehrdeutig: Unflatten kann nicht sagen, ob a.b Ein Schlüssel oder ein verschachteltes war a dann b. Die Fixierung ist, den Trennzeichen in ein Zeichen zu ändern, das nicht in Ihren Tasten erscheint, wie ein Schrägstrich oder eine Pipe, und verwenden Sie denselben Trennzeichen für beide Richtungen Es ist die gleiche Klasse von Fluchtproblem, die Sie sehen, wenn CSV-Grenzer kollidieren mit den Daten‘und es gilt die gleiche Lösung: Wählen Sie ein Trennzeichen, das Ihre Werte nicht enthalten. Außerhalb dieses Falles gibt ein Abflachung gefolgt von einem Abflachung mit passenden Einstellungen das Originaldokument genau wieder, Arrays und leere Behälter enthalten.
Was ist der Unterschied zwischen dem Abflachen und dem Konvertieren in ein anderes Format?
Flattening ist keine Formatkonvertierung; es ist eine Umstrukturierung innerhalb von JSON Die Ausgabe eines Flat ist immer noch JSON, nur mit einer einzigen Ebene von gepunkteten Schlüsseln statt verschachtelt Das ist anders als bei den Konvertern, die JSON in eine wirklich andere Serialisierung verwandeln, und zu wissen, welche man braucht, spart einen Schritt.
Wenn Sie für eine Konfigurationsdatei die gleichen Daten wie YAML ausdrücken möchten, ist die JSON-zu-YAML-Konverter Werkzeug ist, denn es ändert die Syntax und nicht die Form Wenn Sie eine TypeScript-Schnittstelle wünschen, die die Struktur beschreibt, damit Ihr Frontend weiß, was es verarbeitet, ist die JSON-zu-TypeScript-Konverter Folgert aus einer Stichprobe, wenn Sie einen formellen Vertrag zur Validierung wünschen, wird die JSON-Schemaggregat Leitet ein JSON-Schema aus einem Beispiel ab. Flattening sitzt neben diesen, anstatt sie zu ersetzen: Man flacht ab, wenn ein Downstream-System eine Ebene von Schlüsseln möchte, und man konvertiert, wenn ein System eine andere Sprache möchte Ich mache häufig beides nacheinander, mache eine Nutzlast flach, um sie als Spalten zu bearbeiten, und erzeuge dann separat Typen für die verschachtelte Version, die ich an React übergebe. Für hübsches Drucken oder Validieren des JSON an jedem Punkt dieser Kette wird die JSON-Formater Ist das Dienstprogramm, das ich im nächsten Tab offen halte.
Wie entscheidet unflatten zwischen einem Array und einem Objekt?
Dies ist der Mechanismus, der die Hin- und Rückfahrt zum Laufen bringt, und wenn man ihn versteht, erklärt sich sowohl das Tool's-Standardeinstellungen als auch seine eine scharfe Kante. Wenn unflatten ist, liest man eine Taste wie user.roles.0Es teilt es in die Segmente auf user, roles, und 0, dann geht sie Gebäudestruktur wie es geht Bei jedem Schritt schaut es auf das nächste Segment, um zu entscheiden, was für ein Container zu erstellen ist Wenn das nächste Segment eine nicht negative ganze Zahl ist, macht es ein Array; wenn es etwas anderes ist, macht es ein Objekt Also roles.0 Sagt dem Tool, dass roles Ein Array sein soll, dessen erstes Element der Wert ist, während address.city Sagt, dass address Objekt mit einem sein soll city Eigentum.
Diese einzelne Regel, & quot; ganzzahliges Segment bedeutet Array-Index, & quot; ist der Grund, warum ein Abflach und ein Unflatten mit passenden Einstellungen Arrays exakt wiedergeben Es ist auch der Grund, warum die Array-Notation, die Sie wählen, konsistent sein muss In der Punktnotation sind der Array-Index und ein Objektschlüssel beide nur Text zwischen Punkten, sodass das Tool vollständig auf dem Ganzzahltest beruht In der Klammernotation ist die [0] Syntax macht die Absicht explizit, bevor die Spaltung überhaupt passiert Entweder funktioniert, aber das Mischen, Abflachen mit Klammern und Entflachen mit Punkten, bricht das Signal, auf das das Werkzeug angewiesen ist.
Hier ist die scharfe Kante, die sich aus der Regel ergibt: ein Objekt, dessen Tasten wirklich die Saiten sind "0", "1", "2" Ununterscheidbar ist, einmal abgeflacht, von einem Array Beide produzieren die Tasten 0, 1, 2‘und unflatten wird sie als Array neu aufbauen, weil das der überwältigend häufige Fall ist Wenn Sie wirklich ein Objekt mit numerischen String-Tasten brauchen, um die Hin - und Rückfahrt zu überleben, ist das die eine Situation, in der Ihnen das Abflachen und Entflatten nicht den genauen Typ zurückgibt, und Sie sind besser dran, dieses Objekt verschachtelt zu halten oder ein nicht-numerisches Schlüsselschema zu verwenden In Jahren, in denen ich dies getan habe, habe ich diesen Fall genau zweimal getroffen, beide Male in Daten, die wohl von Anfang an falsch modelliert wurden, so ist die Standardeinstellung für fast jeden der richtige Handel Es ist die gleiche Art von pragmatischer Entscheidung, Zahlen mit führenden Nullen wie Zeichenfolgen in den Zeichenfolgen zu halten CSV-zu-JSON-Konverter: Das Tool optimiert fast immer die Bedeutung der Daten und dokumentiert die seltene Ausnahme, anstatt den gemeinsamen Pfad umständlich zu machen.
Kann mein JSON sicher in dieses Tool eingefügt werden?
Ja, und es ist eher architektonisch als ein Versprechen Parsen, Abflachen, Entflatten und Serialisieren laufen alle als JavaScript in Ihrem eigenen Browser Tab. Es gibt keinen Upload, keine Server-Roundtrip, und nichts wird protokolliert oder gespeichert Öffnen Sie Ihren Browser' s Netzwerk-Tab und klicken Sie auf den Aktionsknopf: keine Anfrage geht raus Sobald die Seite geladen wurde, können Sie sich vom Internet trennen und es funktioniert weiter, denn es war nie ein Server in der Schleife, mit dem Sie beginnen konnten.
Das ist wichtiger, als es scheinen mag, denn JSON-Nutzlasten sind genau die Art von Dingen, die Geheimnisse bergen: API-Token in einer Config, persönliche Daten in einer API-Antwort, interne Identifikatoren in einem Einstellungs-Blob Ein Flattener, der Ihr Objekt auf einen Server hochgeladen hat, würde eine private Nutzlast in eine andere verwandeln's-Protokollzeile. Durch die clientseitige Verarbeitung wird das Risiko vollständig beseitigt, weshalb es die Standardeinstellung für jedes Tool auf Toolz.dev ist. Wenn Sie die vollständige Begründung wünschen, habe ich sie in der dargelegt Datenschutzleitfaden für Online-Tools, und das breitere Kit, das ich für diese Art von Arbeit verwende, ist in meinem Leitfaden für Webentwickler-Toolkitdrohen
Häufig gestellte Fragen
Was bedeutet es, JSON platt zu machen?
Flattening JSON wandelt ein verschachteltes Objekt in ein einstufiges Objekt um, dessen Schlüssel der Pfad zu jedem Wert sind. Das verschachtelte {"user":{"city":"Austin"}} Flach wird {"user.city":"Austin"}. Jeder Blattwert bekommt einen punktierten Schlüssel, und es bleibt keine Verschachtelung in der Ausgabe Unflatten kehrt den Prozess um und baut die verschachtelte Struktur wieder auf.
Wie werden Arrays beim Abflachen gehandhabt?
Array-Elemente werden mit ihrem Index als Pfadsegment abgeflacht. {"roles":["admin","editor"]} wird {"roles.0":"admin","roles.1":"editor"} In Punktnotation, bzw {"roles[0]":"admin","roles[1]":"editor"} In Klammerschreibweise Der Index behält die Reihenfolge bei, sodass das Array genau dann neu aufgebaut werden kann, wenn Sie es entflachten.
Kann ich gepunktete Schlüssel wieder in verschachteltes JSON entflatten? Ja. Wechseln Sie in den Unflatten-Modus und fügen Sie ein flaches Objekt ein, dessen Schlüssel gepunktete Pfade sind. Das Tool baut die verschachtelten Objekte und Arrays neu auf und entscheidet Array gegen Objekt, indem es entscheidet, ob jedes Pfadsegment ein ganzzahliger Index ist. Flatten und Unflatten sind exakte Inversen, wenn die Grenzwert- und Array-Notation übereinstimmen.
Was ist der Unterschied zwischen der Punkt - und Klammerarray-Notation?
Beide kodieren denselben Array-Index; lediglich die Syntax unterscheidet sich Punktnotation schreibt items.0.id(die kompakt und in config und i18 n-Tasten üblich ist Klammernotation schreibt items[0].id, die mit der JavaScript-Zugriffssyntax und einigen Abfragesprachen übereinstimmt Wählen Sie aus, was Ihr Zielsystem erwartet, und verwenden Sie für beide Richtungen dasselbe.
Verliert das Plattling irgendwelche Daten? Nr. Skalare, Nullen, Booleans, und sogar leere Objekte und leere Arrays bleiben als Blattwerte erhalten, so dass das Entflattern des Ergebnisses das Originaldokument wiedergibt Das Einzige, was man sich ansehen muss, sind Schlüssel, die bereits Ihren Trennzeichen enthalten, weshalb das Trennzeichen konfigurierbar ist.
Warum sollte ich JSON platt machen? Flattening passt verschachtelte Daten an Systeme an, die eine Ebene von Schlüsseln erwarten: Tabellenkalkulationsspalten, Umgebungsvariablen, gepunktete Übersetzungsschlüssel, Feature-Flag-Speicher und viele Analyse- und Protokollierungspipelines. Der gepunktete Pfad führt die ursprüngliche Struktur durch ein flaches Format, sodass nichts verloren geht.
Was passiert, wenn ein Schlüssel bereits einen Punkt enthält? Ein wörtlicher Punkt im Inneren einer Taste ist mit dem Pfadtrennzeichen mehrdeutig, so dass die Hin- und Rückfahrt ihn an der falschen Stelle aufteilen kann. Ändern Sie den Trennzeichen in ein Zeichen, das nicht in Ihren Tasten erscheint, wie z. B. einen Schrägstrich oder eine Pfeife, und verwenden Sie denselben Trennzeichen sowohl für die Abflachung als auch für die Entflachung.
Wird mein JSON irgendwo hochgeladen? Nr. Parsen und Transformation laufen in Ihrem Browser als JavaScript, es wird nichts übertragen, protokolliert, oder gespeichert, Sie können dies bestätigen, indem Sie den Netzwerk-Tab beim Abflachen beobachten, oder indem Sie offline gehen, da das Tool ohne Verbindung weiter funktioniert.



