Skip to content
Zurück zum Blog
Tutorials

Verschachteltes JSON in CSV abflachen: 5 Strategien + Matrix

Verschachteltes JSON in CSV abflachen mit 5 Strategien: Punktnotation, indizierte Arrays, Zeilenexplosion, Stringify. Entscheidungsmatrix für Excel, Pandas.

12 Min. Lesezeit

Verschachteltes JSON in CSV abflachen: 5 Strategien & Entscheidungsmatrix

Das Geometrieproblem

Das Muster wiederholt sich. Eine API liefert verschachteltes JSON zurück, und die Analystin auf Slack möchte einfach nur eine Tabelle. mongoexport erzeugt $oid-Wrapper und drei Metadatenebenen, während BigQuery eine flache Tabelle erwartet. Verschachteltes JSON in CSV abzuflachen ist kein Syntaxproblem. Es ist ein Geometrieproblem. JSON ist ein Baum, CSV ist ein Raster, und Sie können einen Baum nicht in ein Raster überführen, ohne zu entscheiden, wie die Äste zusammenfallen sollen.

Es gibt genau fünf Kollapsstrategien. Wählen Sie die falsche, dann landen 200 Spalten in Excel, eine Twitter-ID verliert ihre Präzision oder der Round-Trip Ihrer Pipeline bricht. Wählen Sie die richtige, dann ist die Konvertierung ein Einzeiler.

StrategieEinzeilerAm besten geeignet für
Punktnotationcustomer.address.cityAnalyse in Excel/Sheets
Unterstrichcustomer_address_citySQL-freundliche Spalten
Indizierte Arraysitems.0.sku, items.1.skuArrays fester Größe
ZeilenexplosionElternfeld pro Kind wiederholenAnalytik in Pandas/BigQuery
Stringify"{\"city\":\"Seattle\"}" in einer ZelleVerlustfreier Round-Trip

Dieser Leitfaden geht jede Strategie durch, liefert Ihnen eine Entscheidungsmatrix nach Konsument (Excel, Pandas, BigQuery, Postgres) und zeigt vier reale Payloads, bei denen die richtige Strategie nicht die offensichtliche ist. Wenn Sie zusätzlich den allgemeinen bidirektionalen Überblick brauchen (Parser-Bibliotheken, Streaming, Encoding-Fallen), lesen Sie den CSV zu JSON: Methoden, Fallstricke und Code-Beispiele.

Warum verschachteltes JSON nicht in CSV passt

JSON trägt drei Arten von Struktur, die CSV fehlen. Hierarchie ist ein Objekt innerhalb eines Objekts. Sequenz ist ein Array. Mischform ist die Kombination: Arrays von Objekten, Objekte mit Arrays, Arrays von Arrays. Eine typische E-Commerce-Bestellung enthält alle drei auf einmal.

CSV hat genau zwei Dimensionen: Zeilen und Spalten. Es gibt keine dritte Achse für „diese Spalte enthält drei Kinder”. Wenn Sie aus einem Baum ein Raster fordern, muss etwas nachgeben. Entweder verteilen Sie die Kinder auf mehr Spalten (und leben mit Namen wie items.0.options.0.value), verteilen sie auf mehr Zeilen (Elternfelder werden wiederholt), oder pressen sie als Text in eine Zelle und behandeln sie nicht länger als Struktur.

Jede Strategie unten beantwortet diese Frage anders. Manche bewahren Lesbarkeit und opfern Round-Trip-Sicherheit. Andere machen es umgekehrt. Keine ist universell. Passen Sie die Antwort an denjenigen an, der die Datei als Nächstes liest.

5 Abflachungsstrategien im Vergleich

Strategie 1: Punktnotation (customer.address.city)

Die Punktnotation läuft von der Wurzel zum Blatt und verbindet die Schlüssel mit .. Jedes verschachtelte Objekt wird zu einer Spalte pro Blatt, wobei der Pfad im Spaltennamen kodiert ist.

{ "customer": { "address": { "city": "Seattle" } }, "email": "alice@example.com" }

wird zu

customer.address.city,email
Seattle,alice@example.com

In Pandas reicht dafür eine Zeile:

import pandas as pd

data = [{"customer": {"address": {"city": "Seattle"}}, "email": "alice@example.com"}]
df = pd.json_normalize(data, sep='.')
df.to_csv("out.csv", index=False)

In JavaScript genügt eine kleine rekursive Funktion:

function flattenDot(obj, prefix = '', acc = {}) {
  for (const [k, v] of Object.entries(obj)) {
    const key = prefix ? `${prefix}.${k}` : k;
    if (v && typeof v === 'object' && !Array.isArray(v)) {
      flattenDot(v, key, acc);
    } else {
      acc[key] = v;
    }
  }
  return acc;
}

Vorteile: menschenlesbar, Pandas-Standard, der Originalpfad bleibt erhalten. Nachteile: Spaltennamen können lang werden (Kubernetes-Specs erzeugen Namen wie spec.template.spec.containers.0.resources.limits.memory), und der Punkt wird mehrdeutig, sobald ein echter Schlüssel ein . enthält (Google-Analytics-4-Ereignisparameter tun das).

Strategie 2: Unterstrichnotation (customer_address_city)

Dieselbe Idee, anderes Trennzeichen. Ersetzen Sie . durch _, und das Ergebnis ist SQL-sicher: SELECT customer_address_city FROM events funktioniert ohne Quotierung des Bezeichners. BigQuery, Snowflake und Postgres bevorzugen alle diese Variante.

import pandas as pd
df = pd.json_normalize(data, sep='_')

Die Entscheidung zwischen Punkt und Unterstrich hängt allein vom nachgelagerten Werkzeug ab. Excel-Analystinnen lesen den Punkt natürlicher; SQL-Engines akzeptieren den Unterstrich klaglos. Sie wechseln durch das Ändern eines einzigen Arguments.

Vorteile: SQL-sichere Spaltennamen, BigQuery-konforme Bezeichner, keine Quotierung nötig. Nachteile: Die Mehrdeutigkeit bleibt, falls ein Schlüssel _ enthält (seltener als ., aber möglich).

Strategie 3: Indizierte Arrays (items.0.sku, items.1.sku)

Objekte lassen sich sauber abflachen, weil ihre Schlüssel eindeutig sind. Arrays nicht, weil ihre Länge unbegrenzt ist. Die indizierte Strategie behandelt Array-Positionen als Pfadsegmente: items[0] wird zu items.0.

{ "id": "ord-001", "items": [{"sku": "A"}, {"sku": "B"}] }

wird zu

id,items.0.sku,items.1.sku
ord-001,A,B

Das ist das Standardverhalten von Flatten in unserem JSON-zu-CSV-Konverter. Jedes Blatt erhält seine eigene Spalte; die Position wird im Namen vermerkt.

Vorteile: Jeder Wert bekommt seine eigene Zelle, die Position bleibt erhalten, keine Zeilenduplizierung. Nachteile: Die Spaltenzahl explodiert (100 Elemente = 100 Spalten); Zeilen mit unterschiedlichen Array-Längen erzeugen ausgefranste Tabellen; nachgelagerte Aggregation bricht (kein SUM(items.*.qty)).

Strategie 4: Zeilenexplosion (Array in mehrere Zeilen)

Statt die Tabelle zu verbreitern, um das Array unterzubringen, verlängern Sie sie. Wiederholen Sie die Elternfelder einmal pro Array-Element, und lassen Sie jedes Element zu seiner eigenen Zeile werden.

{ "order_id": "ord-001", "customer": "Alice", "items": [{"sku": "A", "qty": 2}, {"sku": "B", "qty": 1}] }

wird zu

order_id,customer,items.sku,items.qty
ord-001,Alice,A,2
ord-001,Alice,B,1

In Pandas erledigt eine Zeile sowohl die Explosion als auch die Normalisierung:

import pandas as pd

orders = [{"order_id": "ord-001", "customer": "Alice",
           "items": [{"sku": "A", "qty": 2}, {"sku": "B", "qty": 1}]}]
df = pd.json_normalize(orders, record_path='items', meta=['order_id', 'customer'])
df.to_csv("orders.csv", index=False)

In SQL leistet UNNEST dasselbe:

SELECT order_id, item.sku, item.qty FROM orders, UNNEST(items) AS item;

Vorteile: Pandas und BigQuery verarbeiten diese Form nativ, Aggregationen funktionieren (GROUP BY order_id), das Schema bleibt schmal. Nachteile: Elternfelder werden in jeder Kindzeile dupliziert (Speicheraufblähung), die 1-zu-n-Grenze ist implizit (Sie brauchen eine order_id), und zwei Arrays auf derselben Ebene erzeugen ein kartesisches Produkt, sofern Sie sie nicht sorgfältig UNNESTen.

Strategie 5: Stringify (JSON in der Zelle)

Flachen Sie überhaupt nicht ab. Serialisieren Sie den gesamten verschachtelten Wert als JSON-Zeichenkette und legen Sie ihn in eine einzige Zelle. Die äußere Tabelle bleibt flach; die Struktur wird wortgetreu im Inneren bewahrt.

{ "id": "ord-001", "items": [{"sku": "A"}, {"sku": "B"}] }

wird zu

id,items
ord-001,"[{""sku"":""A""},{""sku"":""B""}]"

Das ist der Stringify-Modus in unserem JSON-zu-CSV-Konverter. Die Spaltenzahl explodiert nie, die ursprüngliche Form bleibt Byte für Byte erhalten, und die Rückreise rekonstruiert die Eingabe exakt.

Vorteile: 100 % verlustfrei, vorhersehbare Spaltenzahl, Round-Trip-sicher in Kombination mit „Typen ableiten” beim Rückweg. Nachteile: Excel-Nutzer sehen escapte Anführungszeichen, SQL-Engines brauchen JSON-Funktionen, um in den Wert hineinzufragen (JSON_EXTRACT_SCALAR in BigQuery, ->>'key' in Postgres), und Tabellenkalkulationsformeln kommen nicht an den Zellinhalt heran.

5 Strategien nebeneinander

Dieselbe Eingabe in allen fünf Fällen: {"id":"ord-001","customer":{"name":"Alice"},"items":[{"sku":"A","qty":2},{"sku":"B","qty":1}]}.

StrategieSpaltenRound-Trip-sicherBester Konsument
Punktnotationwächst mit ArrayNeinExcel-Analystin
Unterstrichwächst mit ArrayNeinSQL-Warehouse
Indizierte Arrays2 pro Array-SlotNein (mehrdeutig beim Rückweg)Arrays fester Größe
Zeilenexplosionschmal, 1 Zeile pro KindTeilweise (Schlüssel nötig)Pandas / BigQuery
StringifyfestJaPipeline-Round-Trip

Entscheidungsmatrix: Welche Strategie für welchen Konsumenten

Schlagen Sie zuerst den Konsumenten nach und lesen Sie dann die empfohlene Strategie ab.

KonsumentEmpfohlene StrategieWarum
Excel / Sheets (Analystin)Punkt + Stringify für große ArraysLesbare Spaltennamen; große Arrays sprengen das Blatt nicht
Excel-EU (DE/FR/IT/ES)Punkt + ;-Trennzeichen + UTF-8-BOMSemikolon Pflicht; BOM verhindert Encoding-Müll
Pandas (json_normalize + explode)Unterstrich + ZeilenexplosionSQL-freundliche Spalten; Explode harmoniert mit groupby
BigQuery / SnowflakeTSV + Stringify oder ExplodeTab vermeidet Quote-Fallen; JSON_EXTRACT greift in die Zelle
PostgreSQL COPYRFC 4180 + Unterstrich + flachSQL-sichere Spalten; strikte RFC-Quotierung
MongoDB → BigQuery ETLNDJSON direkt laden, CSV überspringenBigQuery lädt NDJSON nativ; CSV ist ein Umweg

Excel / Google Sheets: Die Gebietsschema-Falle

Excel-Spaltennamen haben keine praktische Längenbegrenzung. Die echten Fallen liegen woanders.

Erstens, die Gebietsschema-Spaltung. Europäisches Excel (Deutschland, Frankreich, Italien, Spanien) erwartet ; als Trennzeichen, weil , das Dezimaltrennzeichen ist. Eine kommagetrennte CSV-Datei öffnet sich mit allen Zeilen in Spalte A zusammengefallen. Die Excel-Voreinstellung in unserem JSON-zu-CSV-Konverter wechselt mit einem Klick zu ; + CRLF + UTF-8-BOM.

Zweitens, die wissenschaftliche Notation. Excel sieht 9007199254740993 und zeigt 9,00719925474E+15. Speichern Sie große Ganzzahlen im Quell-JSON als Zeichenketten und aktivieren Sie BOM, damit Excel die Zelle als Text behält. Unser Konverter erkennt große Ganzzahlen automatisch.

Drittens, die praktische Spaltengrenze. Excel unterstützt theoretisch 16.384 Spalten, aber alles über ca. 500 wird unhandhabbar. Stringifizieren Sie die schweren Teilbäume oder projizieren Sie vorab mit jq, bevor Sie konvertieren.

Pandas: json_normalize + explode

Das Standardmuster für verschachtelte Arrays ist record_path + meta in einem Durchlauf:

import pandas as pd

orders = [{
    "order_id": "ord-001",
    "customer": {"name": "Alice", "city": "Seattle"},
    "items": [{"sku": "SKU-100", "qty": 2}, {"sku": "SKU-205", "qty": 1}]
}]

df = pd.json_normalize(orders, record_path='items',
    meta=['order_id', ['customer', 'name'], ['customer', 'city']], sep='_')
df.to_csv("orders.csv", index=False)

Die Ausgabe ist eine Zeile pro Element, wobei order_id, customer_name und customer_city wiederholt werden. Das schlägt das Vorgehen, erst explode und danach json_normalize auszuführen: record_path überspringt die Zwischen-Objekt-Spalte, und meta lässt Sie kontrollieren, welche Elternfelder propagiert werden. Für Eingaben, deren Array-Elemente verschachtelte Objekte enthalten, setzen Sie max_level=, um die Tiefe zu begrenzen.

BigQuery / Snowflake: TSV + JSON in der Zelle

LOAD DATA von BigQuery ist streng bei der CSV-Quotierung und parst Dateien mit Kommas innerhalb quotierter Texte häufig falsch. TSV ist sicherer, weil Tabulatoren in Textfeldern fast nie auftauchen:

bq load --source_format=CSV --field_delimiter='\t' \
  dataset.orders gs://bucket/orders.tsv \
  order_id:STRING,customer:STRING,items:STRING

Wenn Sie verschachtelte Daten als Stringified-JSON in einer einzigen Spalte laden, fragt BigQuery sie trotzdem mit JSON_EXTRACT_SCALAR ab:

SELECT order_id, JSON_EXTRACT_SCALAR(items, '$[0].sku') AS first_sku
FROM dataset.orders;

Snowflake bietet dieselbe Fähigkeit über VARIANT mit Pfadabfragen wie items:0.sku::STRING. In beiden Engines schlägt Stringify + JSON-Pfadabfrage das volle Abflachen, sobald verschachtelte Arrays groß oder von variabler Länge sind.

PostgreSQL COPY: Strikt nach RFC 4180

COPY ... FROM ... WITH (FORMAT csv, HEADER true) ist der strengste RFC-4180-Leser, dem Sie üblicherweise begegnen. Zwei Verhaltensweisen stolpern Leute regelmäßig.

Erstens akzeptiert COPY kein UTF-8-BOM. Die Byte-Order-Markierung wird zu einem wörtlichen Präfix auf dem ersten Spaltennamen (id statt id), und jede Abfrage, die id referenziert, schlägt stillschweigend fehl. Schalten Sie BOM für Postgres-Ziele aus.

Zweitens kann COPY verschachtelte Daten nicht nativ parsen. Entweder explodieren Sie Arrays vor dem Laden in mehrere Zeilen, oder Sie definieren das Ziel als jsonb und stringifizieren den verschachtelten Wert:

CREATE TABLE orders (order_id text PRIMARY KEY, customer text, items jsonb);
COPY orders FROM '/tmp/orders.csv' WITH (FORMAT csv, HEADER true);
SELECT order_id, items->0->>'sku' AS first_sku FROM orders;

Für Pipelines, die durchgängig JSON sprechen, überspringen Sie CSV und nutzen stattdessen COPY ... FROM ... WITH (FORMAT text) mit JSON-Zeilen-Eingabe.

Praxisbeispiele mit realen Payloads

Beispiel 1: E-Commerce-Bestellungen (Kunde + Items-Array)

Eine typische Bestellung kombiniert verschachtelte Kundendaten mit einem Items-Array variabler Länge:

[{ "id": "ord-001",
   "customer": { "name": "Alice", "address": {"city": "Seattle", "country": "US"} },
   "items": [{"sku": "SKU-100", "qty": 2}, {"sku": "SKU-205", "qty": 1}] }]

Die richtige Strategie hängt davon ab, wer die Datei liest. Finance möchte eine Zeile pro Artikel, um den Umsatz je SKU zu berechnen; das ist die Explode-Strategie, die zwei Zeilen mit wiederholtem id und customer.name erzeugt. Operations möchte eine Zeile pro Bestellung für Fulfillment-Dashboards; das ist Punktnotation mit stringifizierten items, damit das Array die Spaltenzahl nicht sprengt. Dieselbe Eingabe, zwei Ausgaben, beide korrekt für ihren Konsumenten.

Fügen Sie die Payload in unseren JSON-zu-CSV-Konverter ein und schalten Sie bei der Option „Nested” zwischen Flatten und Stringify um. Das Beispiel „Verschachtelte E-Commerce-Bestellungen” lädt dieselbe Form.

Beispiel 2: GitHub-Issues-API (Labels-Array + User-Objekt)

Der Endpunkt /repos/{owner}/{repo}/issues liefert eine gemischte verschachtelte Form:

[{ "id": 1001, "title": "Bug: login 404", "state": "open",
   "labels": ["bug", "priority:high"], "user": {"login": "alice"} }]

user ist ein Objekt mit einem brauchbaren Feld; labels ist ein Zeichenkettenarray unbegrenzter Länge. Die pragmatische Abflachung ist hybrid: Punktnotation auf user (Sie interessieren sich nur für user.login) und Inline-Join auf labels zu einer einzigen Zelle, getrennt durch ;:

id,title,state,labels,user.login
1001,Bug: login 404,open,bug;priority:high,alice

„Arrays zu einer Zelle verbinden” und „Objekte mit Punkten abflachen” lassen sich nicht in einer einzigen Strategie gleichzeitig erfassen. Unser Konverter übernimmt die Objekt-Abflachung automatisch; verarbeiten Sie die Labels mit jq vor (map(.labels = (.labels | join(";")))) oder akzeptieren Sie das Standardverhalten der Array-Stringifizierung.

Beispiel 3: MongoDB mongoexport ($oid + Metadaten)

mongoexport --jsonArray erzeugt Extended-JSON-Wrapper:

[{ "_id": {"$oid": "6634a1b2c3d4e5f600000001"},
   "email": "alice@example.com",
   "metadata": { "signupDate": "2026-01-15T10:30:00Z",
                 "preferences": {"newsletter": true, "theme": "dark"} } }]

Der $oid-Wrapper erzeugt eine Spalte mit dem wörtlichen Namen _id.$oid, die die meisten SQL-Engines ablehnen. Verarbeiten Sie sie mit jq vor, um sie auszupacken:

mongoexport --collection=users --jsonArray | jq 'map(._id = ._id."$oid")' > users.json

Für den tief verschachtelten Block metadata.preferences entscheiden Sie nach Konsument. Analystenexport: das Ganze per Punkt abflachen; metadata.preferences.theme liest sich gut. Pipeline-Round-Trip: metadata stringifizieren, um die Struktur intakt zu halten. Für vollständige jq-Muster, die mit CSV-Pipelines zusammenspielen, lesen Sie unseren jq-Spickzettel.

Beispiel 4: Kubernetes-Pod-Spec (tief verschachtelt)

Eine Antwort von kubectl get pod -o json ist der Worst Case für flache Strategien. Die Struktur reicht routinemäßig sechs Ebenen tief (spec.template.spec.containers.0.resources.limits.memory). Naive Punkt-Abflachung erzeugt Spaltennamen mit über 70 Zeichen und 200+ Ausgabespalten. Zwei Strategien funktionieren.

Mit kubectl jsonpath vorprojizieren. Wählen Sie nur die Felder, die Sie tatsächlich brauchen:

kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\t"}{.status.phase}{"\n"}{end}' > pods.tsv

Spec stringifizieren, Metadaten abflachen. Halten Sie metadata (Name, Namespace, Labels) flach und stringifizieren Sie spec in eine einzige Zelle:

kubectl get pods -o json | jq 'map({name: .metadata.name, namespace: .metadata.namespace, spec: (.spec | tostring)})'

Fügen Sie das Ergebnis dann mit dem Flatten-Modus in den Konverter ein. Die Spalte spec wird zu einer JSON-Zelle; Metadaten-Spalten bleiben lesbar. Vermeiden Sie das Anti-Muster kubectl get pod -o json | json-to-csv flatten ohne Vorprojektion. Die Spaltenzahl wird unbeherrschbar.

Round-Trip-Sicherheit: Abflachen ist verlustbehaftet, Stringify verlustfrei

Punktnotation, Unterstrichnotation, indizierte Arrays und Zeilenexplosion sind allesamt Einweg-Projektionen. Sobald Sie mit irgendeiner davon abflachen, lässt sich das ursprüngliche JSON aus der CSV allein nicht mehr perfekt rekonstruieren.

Gegenbeispiele sind leicht zu konstruieren. Eine Spalte namens customer.address.city ist mehrdeutig zwischen {"customer": {"address": {"city": "..."}}} und {"customer": {"address.city": "..."}}. Indizierte Arrays wirken umkehrbar, doch CSV kann nicht sagen, ob items.0.sku zu einem Array oder zu einem Objekt mit numerischem Schlüssel rekonstruiert werden soll. Zeilenexplosion benötigt einen Group-by-Schlüssel; ohne order_id lässt sich nicht sagen, welche Zeilen zum selben Elternteil gehörten.

Nur Stringify übersteht den Round-Trip. Der verschachtelte Wert bleibt wortgetreu als JSON-Zeichenkette erhalten, sodass der Rück-Konverter die Zelle liest, parst und das Original unversehrt wieder einfügt. Konvertieren Sie mit Stringify, speichern Sie die CSV, fügen Sie sie in unseren CSV-zu-JSON-Konverter ein, schalten Sie „Typen ableiten” ein, und Sie erhalten Bytes, die mit der Eingabe identisch sind.

Die praktische Regel: Pipeline-Round-Trip → Stringify. Einmalige Analyse oder Reporting → Punkt, Unterstrich oder Explode je nach Konsument.

Erledigung im Browser-Tool

Der JSON-zu-CSV-Konverter macht zwei der fünf Strategien direkt zugänglich: Flatten (Kombination aus Punktnotation und indizierten Arrays) und Stringify (Bewahrung der Struktur innerhalb einer Zelle). Die anderen drei (Unterstrich, Zeilenexplosion, SQL-Ziel-Voreinstellungen) sind nur einen Vorverarbeitungsschritt entfernt.

Eine typische Sitzung dauert fünf Klicks:

  1. Validieren Sie die Eingabe mit unserem JSON-Formatierer, damit Syntaxfehler nicht zu stillen Konvertierungsfehlern werden.
  2. Fügen Sie das JSON in den JSON-zu-CSV-Konverter ein. Die Konvertierung läuft sofort.
  3. Stellen Sie „Nested” auf Flatten für punktierte und indizierte Schlüssel oder auf Stringify, um Arrays und Objekte in einzelnen Zellen zu behalten.
  4. Wählen Sie eine Voreinstellung: RFC 4180 für Pipelines, Excel für EU-Tabellen, TSV für Warehouses, Pipe für kommareiche Texte.
  5. Klicken Sie auf „Richtung tauschen” und prüfen Sie mit dem CSV-zu-JSON-Konverter bei eingeschaltetem „Typen ableiten” einen Stringify-Round-Trip.

Alles läuft in Ihrem Browser. Interne Exporte und Produktionsgeheimnisse verlassen die Seite nie; nach dem Seitenaufbau gibt es null Netzwerkanfragen. Sicher für sensible Daten, wo das Hochladen auf eine Drittseite nicht infrage kommt.

Häufige Fallstricke

  1. Explosion der Spaltennamen. Kubernetes-Specs und GitHub-PR-Review-Threads erzeugen Hunderte von Blattpfaden. Lösung: mit jq oder kubectl jsonpath vorprojizieren oder schwere Teilbäume stringifizieren, während Sie Metadaten abflachen.
  2. Array-Längen-Mismatch. Zeile 1 hat 3 Elemente, Zeile 2 hat 5. Indizierte Arrays erzeugen leere Zellen in items.3.sku und items.4.sku für Zeile 1. Lösung: zur Zeilenexplosion wechseln.
  3. Index-Schlüssel werden beim Rückweg als Zeichenketten behandelt. Wenn CSV-zu-JSON items.0.sku sieht, ist die 0 technisch ein Zeichenkettenschlüssel. Einige Rück-Konverter rekonstruieren {"0": {"sku": "A"}} statt [{"sku": "A"}]. Lösung: Stringify für Round-Trips verwenden.
  4. Schlüssel, die bereits das Trennzeichen enthalten. GA4-Ereignisse haben Schlüssel wie event_params.key, die wörtliche Punkte enthalten; das Abflachen mit . erzeugt mehrdeutige Pfade. Lösung: Unterstrich verwenden oder die betreffenden Schlüssel umbenennen. Hintergrund zu JSON-Formaten mit erweiterter Schlüsselunterstützung im Leitfaden Von JSON5 bis JSONC.
  5. Gemischte Ebenen-Typen. Einige Zeilen haben address als Objekt, andere als null. Das Abflachen erzeugt leere Zellen, wo das Objekt null war. Der Schema-Notes-Hinweis in unserem Konverter macht darauf aufmerksam, sodass Sie den nachgelagerten Konsumenten überprüfen können.
  6. Große Ganzzahlen werden von Excel abgeschnitten. Ein $oid-Long, eine Twitter-Snowflake-ID oder ein K8s-resourceVersion überschreitet JavaScripts sicheren Bereich (2^53 − 1) und wird stillschweigend gerundet. Excel zeigt sie dann als 9,00719925474E+15. Lösung: IDs im Quell-JSON als Zeichenketten speichern, BOM aktivieren und die Excel-Voreinstellung nutzen.

FAQ

Wie flacht man verschachteltes JSON am besten in CSV ab?

Wie man verschachteltes JSON am besten in CSV abflacht, hängt vom nachgelagerten Konsumenten ab. Verwenden Sie die Punktnotation für Excel oder Google Sheets. Nutzen Sie die Zeilenexplosion, wenn Pandas oder BigQuery die Daten aggregieren. Verwenden Sie Stringify, wenn die CSV verlustfrei zurück nach JSON kommen muss. Passen Sie die Strategie an den nächsten Leser an.

Wie konvertiere ich ein JSON-Array in mehrere CSV-Zeilen?

Konvertieren Sie ein JSON-Array mit der Explode-Strategie in mehrere CSV-Zeilen: Duplizieren Sie die Elternfelder einmal pro Array-Element, sodass jedes Element zu seiner eigenen Zeile wird. In Pandas erledigt das pd.json_normalize(data, record_path='items', meta=['order_id']) in einem Aufruf. In SQL erzeugt UNNEST(items) dieselbe Form. Elternschlüssel wiederholen sich über die explodierten Zeilen hinweg.

Kann ich CSV in das ursprüngliche verschachtelte JSON zurück-Round-Trippen?

Das Zurück-Round-Trippen von CSV in das ursprüngliche verschachtelte JSON funktioniert nur mit dem Stringify-Modus. Punktnotation, Unterstrich, indizierte Arrays und Zeilenexplosion sind verlustbehaftete Einweg-Projektionen; der Rück-Konverter kann den Baum nicht perfekt rekonstruieren. Stringify bewahrt Arrays und Objekte als JSON innerhalb einer einzelnen Zelle, sodass der vollständige Round-Trip bei eingeschaltetem „Typen ableiten” Byte-identisch ist.

Warum zeigt Excel mein abgeflachtes JSON als eine lange Spalte?

Excel zeigt Ihr abgeflachtes JSON als eine lange Spalte, wenn Sie sich in einem europäischen Gebietsschema befinden (Deutschland, Frankreich, Italien, Spanien), in dem das Komma für Dezimalstellen reserviert ist und Excel Semikola als Trennzeichen erwartet. Die Excel-Voreinstellung in JSON-zu-CSV wechselt mit einem Klick zu ; + CRLF + UTF-8-BOM.

Soll ich für Spaltennamen Punktnotation oder Unterstrich verwenden?

Verwenden Sie die Punktnotation, wenn das Ziel Excel, Google Sheets oder Pandas ist; Punkte sind die json_normalize-Voreinstellung und lesen sich natürlich. Verwenden Sie den Unterstrich, wenn das Ziel SQL ist: Postgres, BigQuery und Snowflake verlangen eine Quotierung um Bezeichner mit Punkten, während Unterstriche überall ohne Quotierung akzeptiert werden.

Wie verarbeitet pandas json_normalize Arrays von Objekten?

Pandas json_normalize verarbeitet Arrays von Objekten über die Argumente record_path und meta. pd.json_normalize(data, record_path='items', meta=['order_id']) explodiert items in eine Zeile pro Element mit wiederholtem order_id. Für verschachtelte Objekte ohne Arrays erzeugt das einfachere pd.json_normalize(data, sep='_') unterstrichgetrennte Spaltennamen wie customer_address_city. Verwenden Sie max_level=, um die Tiefe bei tiefen Bäumen zu begrenzen.

Wie hoch ist die Spaltengrenze beim Abflachen tief verschachtelter JSON-Daten?

Die Spaltengrenze beim Abflachen tief verschachtelter JSON-Daten liegt in Excel bei 16.384 und in CSV selbst praktisch unbegrenzt, doch ab 500 Spalten wird die Ausgabe unhandhabbar. Kubernetes-Pod-Specs oder GraphQL-Antworten überschreiten diese Marke leicht. Stringifizieren Sie die schweren Teilbäume mit dem JSON-zu-CSV-Konverter oder projizieren Sie vorab mit jq oder kubectl jsonpath.

Ist jq ein gutes Werkzeug zum Abflachen von JSON vor der CSV-Konvertierung?

Ja, jq ist das richtige Werkzeug zum Abflachen von JSON vor der CSV-Konvertierung. Es übernimmt Vorprojektion (map({id, name})), Vor-Explosion (.[] | {id, item: .items[]}) und Strukturnormalisierung in einer Zeile. Die jq-Pipeline läuft vor dem CSV-Schritt und steuert genau, welche Felder den Konverter erreichen. Muster dazu finden Sie im jq-Spickzettel.

Fazit

  1. JSON-zu-CSV ist ein Geometrieproblem, kein Syntaxproblem. Ein Baum passt nicht in ein Raster, ohne dass Sie entscheiden, wie die Äste zusammenfallen.
  2. Fünf Strategien decken das praktische Universum ab (Punkt, Unterstrich, indizierte Arrays, Zeilenexplosion, Stringify). Wählen Sie nach Konsument.
  3. Stringify ist der einzige verlustfreie Weg. Verwenden Sie ihn für Pipeline-Round-Trips.
  4. Excel-EU und BigQuery haben Voreinstellungen aus gutem Grund. Nutzen Sie sie.
  5. Reale Payloads (mongoexport, Kubernetes-Specs, GitHub-Antworten) brauchen meist zuerst einen jq- oder kubectl jsonpath-Vorprojektionsschritt.

Probieren Sie Ihre eigene Payload im JSON-zu-CSV-Konverter. Läuft lokal, beherrscht alle fünf Strategien und Round-Trippt verlustfrei mit Stringify. Es gibt weder Upload noch Anmeldung, und die Daten verlassen Ihren Browser nicht.

Verwandte Artikel

Alle Artikel anzeigen