JSON in CSV konvertieren, ohne die Datenbedeutung zu verlieren
JSON und CSV lösen unterschiedliche Aufgaben. JSON bewahrt Objekte, Listen und Datentypen; CSV ordnet Werte in Zeilen und Spalten an. Die Umwandlung ist praktisch, wenn ein Auszug in einer Tabellenkalkulation geprüft werden soll, aber sie ist nie neutral. Vor dem Konvertieren muss feststehen, was eine Zeile darstellt, welche Felder zu Spalten werden, welche Typen als Text geschrieben werden und welche Information sich nicht wiederherstellen lässt.
CSV als „JSON ohne Klammern“ zu betrachten, führt zu schlechten Exporten. RFC 8259 erlaubt verschachtelte Strukturen, null, Boolesche Werte, Zahlen und Zeichenketten. RFC 4180 beschreibt kommagetrennte Datensätze: Felder mit Komma, Anführungszeichen oder Zeilenumbruch werden in Anführungszeichen gesetzt, und Anführungszeichen in Daten werden verdoppelt. Keiner der Standards bestimmt, wie ein Kunde mit mehreren Bestellungen in eine einzelne Zeile passt. Das ist eine Entscheidung des Exportvertrags.
Das Problem
Das Problem beginnt, wenn ein Export Daten unterschiedlicher Kardinalität vereint. Ein Datensatz kann einen Kunden und eine Adresse, aber mehrere Bestellungen enthalten; jede Bestellung kann mehrere Positionen haben. Wenn jeder Kunde eine Zeile belegt, wo bleiben zwei Bestellungen? Wenn jede Position eine Zeile belegt, sollen Kunden- und Bestellwerte wiederholt werden? Beide Antworten können für verschiedene Zwecke richtig sein, doch sie erzeugen Dateien mit unterschiedlicher Bedeutung.
Auch Datentypen bergen Risiken. Die Kennung "00073" ist nicht die Zahl 73: die Nullen können zum Code gehören. Eine Zelle mit true kann je nach Importer einen Booleschen Wert oder Text bedeuten. null bedeutet, dass kein Wert vorhanden ist, während eine leere Zeichenkette einen bekannten, aber leeren Wert bedeuten kann. Werden alle Fälle zu einer leeren Zelle, sieht das Tabellenblatt ordentlich aus, verliert aber Information für einen späteren Import.
Trennzeichen ersetzen Escaping nicht. Eine Notiz wie Lieferung nach Madrid, Tür 4 enthält ein Komma und muss in Anführungszeichen stehen. Eine zweizeilige Notiz muss ihren Umbruch innerhalb eines quoted Felds behalten. Dass eine Anwendung die Datei richtig öffnet, beweist nicht, dass ein anderer Importer dieselben Regeln für Trennzeichen, Kodierung oder Zeilenenden verwendet.
Praktisches Beispiel
Verwenden Sie ein kleines synthetisches Beispiel statt echter Kundendaten. Dieses JSON enthält einen Kunden, zwei Bestellungen, eine Tag-Liste, einen Nullwert, einen Booleschen Wert, Codes mit führenden Nullen, ein Komma und einen Zeilenumbruch.
{
"customer": {
"id": "00073",
"name": "Lucía, S.A.",
"marketingAllowed": false,
"phone": null,
"tags": ["grosshandel", "prioritaet"],
"address": { "city": "Madrid", "postalCode": "08001" }
},
"orders": [
{ "id": "ORD-001", "paid": true, "note": "Vor Lieferung anrufen\nam Nachmittag", "items": [{ "sku": "A-01", "qty": 2 }, { "sku": "B-02", "qty": 1 }] },
{ "id": "ORD-002", "paid": false, "note": "Lieferung nach Valencia, Empfang", "items": [{ "sku": "C-03", "qty": 4 }] }
]
}
Ein Export mit einer Zeile je Bestellposition kann die Spalten customer.id, customer.name, customer.marketingAllowed, customer.phone, customer.address.city, customer.address.postalCode, order.id, order.paid, order.note, item.sku und item.qty besitzen. Die erste Zeile enthält "00073", "Lucía, S.A.", false, eine leere Zelle, Madrid, "08001", ORD-001, true, eine mehrzeilige Notiz in Anführungszeichen, A-01 und 2. Kundendaten wiederholen sich, weil eine Zeile eine Position und keinen Kunden darstellt.
Vorgehensweise
Definieren Sie zuerst die Granularität der Zeile in einem prüfbaren Satz: „Eine Zeile ist eine Bestellposition“ oder „Eine Zeile ist eine Bestellung“. Listen Sie danach die JSON-Pfade auf, die Spalten werden, und benutzen Sie stabile Namen wie customer.address.postalCode. Vermeiden Sie allgemeine Überschriften wie id; sie werden mehrdeutig, sobald Kunden- und Bestellkennung nebeneinander stehen.
Entscheiden Sie dann über jedes Array. Für orders und items erzeugt eine normalisierte Strategie eine Zeile pro Kombination aus Bestellung und Position und wiederholt Felder höherer Ebenen. Das hilft beim Filtern von Mengen und Summieren von Verkäufen. Wenn das Ziel eine Zeile pro Bestellung braucht, kann items als JSON in einer Zelle serialisiert werden, doch CSV legt dann nicht jede Eigenschaft getrennt offen. Für tags dokumentieren Sie, ob Werte mit ; verbunden, nummerierte Spalten erzeugt oder eine separate Tabelle angelegt wird. Erfinden Sie kein Trennzeichen, wenn ein Tag es selbst enthalten kann.
Legen Sie ebenfalls Typdarstellungen fest. Behalten Sie Kennungen und Postleitzahlen als Text; wählen Sie beim Spreadsheet-Import Text, bevor 00073 zu 73 wird. Schreiben Sie Boolesche Werte als true und false oder als ein anderes vereinbartes Paar, ohne Ja, 1 und true zu mischen. Wählen Sie eine explizite Null-Regel, etwa eine leere Zelle mit einer Spezifikation, die sie von der leeren Zeichenkette unterscheidet. Testen Sie Umlaute, Kommas, Anführungszeichen und Umbrüche.
Validieren Sie zuletzt mit einem CSV-Leser, der dem vereinbarten Format folgt. Prüfen Sie die erwartete Zeilenzahl: Das Beispiel hat drei Bestellpositionen. Kontrollieren Sie, dass ein Daten-Anführungszeichen in einem quoted Feld verdoppelt wird und ein Zeilenumbruch keinen zusätzlichen Datensatz erzeugt. Ein Konverter kann die Datei erzeugen; der Integrationsvertrag bleibt Verantwortung der betreibenden Seite.
Technische Erklärung
Beim Flattening werden Pfade eines Baums zu Spaltennamen. customer.address.city bewahrt den Pfad, macht eine Hierarchie aber nicht allein reversibel. Objektpfade sind relativ direkt, weil ein Objekt pro Schlüssel einen Wert hat. Arrays verändern die Beziehung: Eine Liste enthält null, einen oder viele Werte, während eine Tabelle zwischen wiederholten Zeilen, verbundenen Werten oder einer weiteren Tabelle wählen muss.
Der Ansatz wiederholter Zeilen ähnelt verknüpften Datenbanktabellen. Für jeden Eintrag von orders[0].items kopiert der Exporter Werte aus customer und orders[0]. So lassen sich Mengen summieren, ohne JSON in einer Zelle zu analysieren. Der Preis ist Duplizierung. Ändert jemand den Kundennamen nur in einer Zeile, widersprechen sich die Zeilen. CSV ist daher häufig ein Austausch- oder Analyseformat, nicht die einzige Quelle der Wahrheit.
RFC 4180 verlangt Anführungszeichen bei Feldern mit Kommas, Anführungszeichen oder Zeilenumbrüchen; ein Anführungszeichen in Daten wird zweimal geschrieben. Ersetzen Sie Kommas nicht einfach durch Semikolons: Das verändert den Inhalt und scheitert, wenn ein Empfänger Kommas erwartet. Legen Sie auch Kodierung und Zeilenenden fest, denn CSV enthält keine verlässlichen Metadaten für alle Importentscheidungen.
Häufige Fehler
Ein häufiger Fehler ist, nur den ersten Listeneintrag auszuwählen und den Rest zu verwerfen. Der Export einer Zeile je Bestellung mit nur dem ersten item wirkt erfolgreich, verliert aber stillschweigend Daten. Ein weiterer Fehler ist das Verbinden von Werten mit Komma ohne Escaping: Lucía, S.A. sieht dann wie zwei Spalten aus. Ein dritter Fehler ist eine leere Spalte für null und ""; kein späterer JSON-Aufbau kann unterscheiden, welcher Wert vorlag.
Ebenso falsch ist die Annahme, ein Tabellenblatt bewahre Typen. Es kann 00073 in 73 wandeln, ORD-001 mit lokalen Einstellungen als Datum interpretieren oder große Zahlen wissenschaftlich anzeigen. Soll die Datei reimportiert werden, liefern Sie eine Spaltenspezifikation und ein Testbeispiel. Bewahren Sie das ursprüngliche JSON oder eine Chargenkennung auf, damit die Quelle auffindbar bleibt.
Wohlgeformtes CSV ist außerdem nicht automatisch sichere Information. Eine nutzergesteuerte Zelle, die mit =, +, - oder @ beginnt, kann in manchen Programmen als Formel behandelt werden. Für Spreadsheet-Exporte ist eine zum Ziel passende Abwehrregel anzuwenden und zu testen. Ändern Sie Daten einer kritischen Integration nicht stillschweigend, ohne diesen Vertrag zu dokumentieren.
Wichtige Überlegungen
Fragen Sie vor dem Spaltendesign, wer die Datei lesen wird. Für eine schnelle Analyse kann eine breite, wiederholte Tabelle passen. Für eine Migration eignen sich vielleicht mehrere verknüpfte CSV-Dateien — Kunden, Bestellungen und Positionen — die über Textkennungen verbunden sind. Für eine Sicherung bewahrt JSON die ursprüngliche Struktur besser. Dieselben Daten können drei verschiedene Exporte benötigen, ohne dass einer allgemein richtig ist.
Pflegen Sie neben dem Exporter eine Mapping-Tabelle: JSON-Pfad, CSV-Spalte, erwarteter Typ, Transformation, Nullbehandlung und Beispiel. Nehmen Sie Grenzfälle auf, etwa ein leeres Array, eine Notiz mit Anführungszeichen und einen Kunden ohne Telefon. Versionieren Sie das Mapping, wenn sich eine Spalte ändert. Ein Verbraucher, der customer.id benötigt, sollte nicht zufällig erfahren, dass die Spalte nun client_code heißt.
Datenschutz beeinflusst die Konvertierung ebenfalls. Felder vor dem Export zu reduzieren, ist meist sicherer als sie später in einer geteilten Arbeitsmappe auszublenden. Das Beispiel ist erfunden und deshalb wiederverwendbar. Enthält eine Datei personenbezogene Daten, beschränken Sie Zugriffe, vermeiden Sie nicht geprüfte Dienste und beachten Sie die Pflichten der verantwortlichen Organisation.
Grenzen
Keine JSON-zu-CSV-Konvertierung erhält automatisch jede Bedeutung jedes Dokuments. CSV unterscheidet nicht selbst zwischen Zahl und Text, Null und leer, fehlendem und leerem Objekt oder einer Ein-Element-Liste und Text, der wie eine Liste aussieht. Ein Round-Trip kann ausgewählte Zeilen rekonstruieren, wenn zusätzliche Regeln gespeichert werden, aber nicht in allen Fällen den ursprünglichen Baum.
Dieser Leitfaden zertifiziert keine Kompatibilität mit einer bestimmten Tabellenkalkulation und ersetzt weder API-Vertrag noch Integrationstest oder professionelle Beratung zu regulierten Daten. Das Importverhalten hängt vom Programm, von Regionseinstellungen und Kodierung ab. Testen Sie stets synthetische Kopien und prüfen Sie das reale Ziel, bevor Sie eine wichtige Charge verarbeiten.
Checkliste
Definieren Sie, was eine Zeile darstellt und welche JSON-Pfade Spalten werden. Wählen und dokumentieren Sie für jedes Array eine Strategie und deren Duplizierung. Bewahren Sie Kennungen mit führenden Nullen als Text. Definieren Sie Boolesche Werte, Null und leere Zeichenkette eindeutig. Escapen Sie Kommas, Anführungszeichen und Umbrüche nach CSV-Regeln. Testen Sie das synthetische JSON, zählen Sie Zeilen und lesen Sie die Datei mit dem vorgesehenen Verbraucher zurück. Bewahren Sie JSON bei notwendiger Strukturfidelity auf und veröffentlichen Sie ein versioniertes Mapping, damit andere den Export reproduzieren können.