Guide
CSV zu JSON: Fallen, die Daten zerstören
Die Konvertierung selbst ist trivial. Die Datenverfälschung passiert bei den zwei Fragen, die Konverter still beantworten: Wo endet dieses Feld, und welchen Typ hat dieser Wert?
By Buğra SözeriPublished
CSV in JSON zu konvertieren wirkt wie die einfachste Aufgabe in der Datenverarbeitung: Zeilen rein, Objekte raus. Es ist gleichzeitig einer der zuverlässigsten Wege, einen Datensatz ohne eine einzige Fehlermeldung zu beschädigen. Die Beschädigung entsteht nie durch den Konvertierungsschritt selbst — sie entsteht durch zwei Fragen, die jeder Konverter beantworten muss, meist stillschweigend: wo endet dieses Feld, und welchen Typ hat dieser Wert.
CSV wirkt einfach. Ist es nicht.
JSON hat eine echte Grammatik (ECMA-404). CSV hat RFC 4180, das weniger eine Spezifikation als eine Beschreibung verbreiteten Verhaltens ist — und viele reale Dateien ignorieren selbst das. Die Regeln der RFC, die naiver Code falsch macht:
- Felder dürfen quotiert werden, und ein quotiertes Feld darf Kommas enthalten, sodass
"Schmidt, Johann"ein Feld ist. Eine Zeile bei Kommas aufzuteilen ist falsch, sobald ein Feld quotiert ist. - Anführungszeichen werden durch Verdopplung escaped:
"5'10"""kodiert5'10". Backslash-Escaping, das viele selbstgebaute Parser annehmen, ist nicht RFC 4180. - Quotierte Felder dürfen Zeilenumbrüche enthalten. Eine mehrzeilige Adresse ist gültiges CSV, was bedeutet, dass man eine CSV-Datei nicht einmal zeilenweise lesen kann. Diese eine Regel ist, warum ein korrekter Parser zustandsbehaftet sein muss.
Dann kommt hinzu, was die RFC nicht abdeckt: Dateien, die mit Semikolons oder Tabulatoren „getrennt“ sind (europäische Gebietsschemata, wo das Komma das Dezimaltrennzeichen ist), eine UTF-8-Byte-Order-Mark, die drei unsichtbare Bytes still an den ersten Spaltennamen klebt (sodass Ihr Code nach id sucht, der Schlüssel aber tatsächlich id ist), und veraltete Kodierungen wie Windows-1252, die jeden Namen mit Umlaut zu Mojibake machen, wenn er als UTF-8 gelesen wird. Ein Konverter, der den Trenner nicht erkennt, das BOM nicht entfernt und die Kodierung nicht richtig bestimmt, beschädigt die Datei, bevor die Typbehandlung überhaupt beginnt.
Kopfzeilen-Erkennung
RFC 4180 macht die Kopfzeile optional, und nichts in der Datei sagt, ob sie vorhanden ist. Raten Sie in die eine Richtung falsch, wird Ihr erster Datensatz zu den Schlüsselnamen für alle anderen; raten Sie in die andere Richtung falsch, erhalten Sie Schlüssel wie field1. Gute Konverter nutzen eine Heuristik — eine erste Zeile aus lauter nicht-numerischen, nicht-wiederholenden Strings ist wahrscheinlich eine Kopfzeile — aber Heuristiken scheitern bei reinen Textdaten, daher lässt Sie jeder brauchbare Konverter die Annahme überschreiben. Achten Sie auch auf doppelte Kopfzeilen-Namen: JSON-Objektschlüssel müssen eindeutig sein, zwei amount-Spalten bedeuten also, dass eine still gewinnt oder umbenannt wird.
Das Typproblem: alles ist ein String
CSV kennt keine Typen. 42, TRUE und 2024-01-05 sind alle nur Zeichenfolgen, und der Konverter muss entscheiden, was daraus in JSON wird. Jede Wahl verliert etwas:
- Führende Nullen. Erkennt man
02134als Zahl, wird aus der Postleitzahl2134. Dasselbe gilt für Telefonnummern, Produktcodes und Bankleitzahlen: Kennungen, die numerisch aussehen, sind keine Zahlen. - Große Ganzzahlen. JSONs Grammatik erlaubt Zahlen beliebiger Größe, aber JavaScript (und die meisten JSON-Parser) speichern sie als IEEE-754-Doubles, exakt nur bis 253 − 1. Eine 19-stellige Datenbank-ID oder eine kreditkartenlange Zahl wird still auf einen nahegelegenen Wert gerundet. IDs gehören in Strings.
- Booleans. Ist
TRUEder JSON-Werttrueoder der String, den jemand eingegeben hat? Was ist mitYes,Y,1? Es gibt keine richtige Antwort, nur eine dokumentierte. - Daten. JSON hat überhaupt keinen Datumstyp, und
03/04/2024ist der 4. März oder der 3. April, je nach Gebietsschema. Daten als Strings zu behalten ist die einzige sichere Standardeinstellung. - Leere Felder. CSV kann
nullnicht von einem leeren String oder einem fehlenden Wert unterscheiden; JSON unterscheidet alle drei.
Excel verdient hier eine eigene Warnung, denn ein Großteil der CSV-Beschädigung passiert, bevor überhaupt ein Konverter die Datei sieht. Excel wendet beim Öffnen aggressive Typerkennung an: Führende Nullen werden entfernt, Ganzzahlen über 15 Stellen werden gerundet, und datumsähnliche Strings werden umgewandelt — bekanntermaßen auch menschliche Gennamen wie MARCH1 und SEPT2, die in Tausenden veröffentlichter Genetikstudien als Daten erschienen, bis die Gene 2020 offiziell umbenannt wurden. Wurde eine CSV jemals in Excel geöffnet und gespeichert, behandeln Sie jede numerisch wirkende Kennung darin als verdächtig.
Die konservative Regel: Lassen Sie den Konverter Typen für offensichtliche Messwerte erkennen, behalten Sie aber alles, was als Kennung fungiert — Postleitzahlen, IDs, Kontonummern — als String, und prüfen Sie das Ergebnis stichprobenartig, bevor Sie ihm vertrauen.
Flache Zeilen vs. verschachteltes JSON
Eine CSV-Zeile ist flach; ein JSON-Objekt muss es nicht sein. Soll das Ergebnis verschachtelt sein, muss die Verschachtelung in den Spaltennamen kodiert werden, und die De-facto-Konvention sind Pfad-Kopfzeilen: Eine Spalte namens user.address.city (Punktnotation) oder user[address][city] (Klammernotation) wird zu verschachtelten Objekten, und items[0].sku, items[1].sku zu einem Array von Objekten. Viele Konverter und Bibliotheken unterstützen diese Expansion; nichts davon ist standardisiert, sodass Punkte, die eigentlich Teil eines Spaltennamens sind (price.usd als flacher Schlüssel), falsch expandiert werden, sofern das Werkzeug die Expansion nicht abschaltbar macht. Wählen Sie eine Konvention, wenden Sie sie in beide Richtungen an, und dokumentieren Sie sie.
Zurück-Konvertieren: JSON nach CSV verliert mehr
Die umgekehrte Konvertierung ist verlustreicher. Ein einheitliches Array flacher Objekte bildet sich sauber auf eine Tabelle ab; alles andere erzwingt Entscheidungen. Verschachtelte Objekte werden zu Pfad-Spalten abgeflacht. Arrays sind schlimmer: Eine Bestellung mit drei Positionen explodiert entweder zu drei Zeilen (was die Bestellfelder dupliziert und die Zeilenzahl ändert) oder wird als JSON-String in einer CSV-Zelle serialisiert — technisch gültig, praktisch unlesbar in einer Tabellenkalkulation. Datensätze mit unterschiedlichen Schlüsseln vereinigen sich zu einer breiten, dünn besetzten Tabelle, in der null, leerer String und „Schlüssel fehlt“ alle in dieselbe leere Zelle fallen. Übersteht Ihr Datensatz CSV→JSON→CSV byteidentisch, war er wirklich tabellarisch; wenn nicht, zeigt der Unterschied genau, welche Struktur CSV nicht tragen kann. Das Zwischenergebnis-JSON in einem Formatierer zu prüfen, bevor Sie zurückkonvertieren, macht diese Verluste sichtbar statt still.
Wann JSONL einem JSON-Array überlegen ist
Eine konventionelle Konvertierung packt jedes Zeilenobjekt in ein großes JSON-Array — das heißt, ein Konsument muss die gesamte Datei parsen, bevor er den ersten Datensatz anfasst, und ein Produzent muss alles im Speicher halten, um die schließende Klammer zu schreiben. JSON Lines (JSONL/NDJSON) verzichtet auf das Array: ein vollständiges JSON-Objekt pro Zeile, durch Zeilenumbruch getrennt. Jede Zeile lässt sich unabhängig parsen, sodass das Format wie CSV streamt, angehängt und aufgeteilt werden kann und sich grepen lässt, während JSONs Typen und Verschachtelung erhalten bleiben. Es ist das native Massenformat für Werkzeuge wie BigQuery und Elasticsearch, und die richtige Wahl, sobald die Zeilenzahl groß oder unbegrenzt ist. Faustregel: JSON-Array für konfigurationsgroße Nutzlasten, die eine API auf einmal zurückgibt; JSONL für Datensätze.
Größe und Streaming
JSON wiederholt jeden Schlüsselnamen in jedem Datensatz, sodass die konvertierte Ausgabe typischerweise zwei- bis viermal so groß ist wie die Quell-CSV — bedenkenswert, bevor Sie einen mehrere Gigabyte großen Export konvertieren. Umgekehrt bedeutet CSVs Regel zu quotierten Zeilenumbrüchen, dass korrektes Streaming weiterhin einen zustandsbehafteten Parser braucht, keinen Zeilen-Splitter. Für Dateien bis in den Bereich mehrerer Dutzend Megabyte erledigt ein Browser-Konverter die gesamte Aufgabe lokal; darüber hinaus streamen Sie mit einer Bibliothek (Pythons csv-Modul, PapaParse und ihre Entsprechungen parsen alle inkrementell) und geben JSONL aus, damit keine Seite den Datensatz im Speicher halten muss. Und wandert die Daten in eine Konfigurationsdatei statt in eine Pipeline, ist JSON womöglich ohnehin nicht die Endstation — siehe unseren Vergleich von JSON und YAML für Konfigurationsdateien.
Kurzfassung: CSV mit einem echten Parser lesen, niemals mit einem Komma-Split; das BOM entfernen und Trenner sowie Kodierung bestätigen; Kennungen unabhängig davon, wie numerisch sie aussehen, als Strings behandeln; Datendateien niemals durch Excel schleusen; Verschachtelung mit einer dokumentierten Pfad-Konvention kodieren; und zu JSONL greifen, sobald die Daten nicht mehr bequem in den Speicher passen.
Frequently asked questions
- Wie konvertiere ich CSV in JSON?
- Parsen Sie die CSV mit einem echten RFC-4180-Parser (niemals mit einem naiven Split bei Kommas), behandeln Sie die erste Zeile als Feldnamen und geben Sie ein JSON-Objekt pro Datenzeile mit diesen Namen als Schlüsseln aus. Ein clientseitiger Konverter macht das im Browser, ohne die Datei hochzuladen; im Code nutzen Sie eine etablierte CSV-Bibliothek Ihrer Sprache, statt die Quotierungsregeln selbst nachzubauen. Die beiden bewusst zu treffenden Entscheidungen sind der Umgang mit der Kopfzeile und ob Typen erkannt oder alles als String behandelt werden soll.
- Warum bricht das Aufteilen einer CSV-Zeile bei Kommas?
- Weil RFC 4180 quotierte Felder erlaubt, und ein quotiertes Feld kann Kommas, doppelte Anführungszeichen (durch Verdopplung escaped) und sogar Zeilenumbrüche enthalten. Ein Wert wie "Schmidt, Johann" ist ein Feld, nicht zwei, und eine quotierte Adresse darf legal mehrere Zeilen umfassen. Das Aufteilen bei Kommas — oder zeilenweises Lesen — parst all das falsch. Jeder korrekte Konverter nutzt einen zustandsbehafteten Parser, der verfolgt, ob er sich innerhalb von Anführungszeichen befindet.
- Warum verändert Excel meine CSV-Werte?
- Excel wendet beim Öffnen aggressive Typerkennung an: Führende Nullen werden bei allem entfernt, was wie eine Zahl aussieht (Postleitzahlen, Telefonnummern, Produktcodes), Ganzzahlen mit mehr als 15 Stellen werden gerundet, um in die Gleitkomma-Zellen zu passen, und datumsähnliche Strings werden umgedeutet — bekanntermaßen auch Gennamen wie MARCH1 und SEPT2, die in Tausenden veröffentlichter Genetikstudien als Daten erschienen, bis die Gene 2020 offiziell umbenannt wurden. Der Schaden entsteht beim Öffnen und wird beim Re-Export zurückgespeichert. Importieren Sie CSV über Excels Datenimport-Dialog mit auf Text gesetzten Spalten, oder vermeiden Sie es ganz, Datendateien durch Excel zu schleusen.
- Wie konvertiere ich CSV in JSON mit verschachtelten Objekten?
- CSV ist flach, Verschachtelung muss also in den Spaltennamen kodiert werden. Die übliche Konvention sind Punkt- oder Klammer-Pfade: Spalten namens user.name und user.address.city (oder user[address][city]) werden zu verschachtelten Objekten, und items[0], items[1] zu Arrays. Konverter und Bibliotheken mit „Header-Pfad-Expansion“ machen das automatisch; ohne sie erhalten Sie ein flaches Objekt pro Zeile und müssen im Code umstrukturieren. Es gibt keinen Standard — wählen Sie eine Konvention und nutzen Sie sie konsequent in beide Richtungen.
- Wann sollte ich JSON statt CSV verwenden — und umgekehrt?
- Nutzen Sie CSV, wenn die Daten wirklich tabellarisch sind (jede Zeile gleiche Spalten, skalare Werte), in Tabellenkalkulationen geöffnet werden müssen oder so groß sind, dass JSONs wiederholte Schlüsselnamen schaden. Nutzen Sie JSON, wenn Datensätze verschachtelt sind, Felder zwischen Datensätzen variieren oder Typen wichtig sind — CSV kennt keine Typen, sodass Zahlen, Booleans und Nullwerte nur in JSON erhalten bleiben. Für große Datenströme kombiniert JSON Lines (ein Objekt pro Zeile) JSONs Typen mit CSVs zeilenweiser Verarbeitung.
- Welche Daten gehen beim Konvertieren von JSON nach CSV verloren?
- Alles, was keine flache Tabelle aus Skalaren ist. Verschachtelte Objekte müssen zu pfadbenannten Spalten abgeflacht werden; Arrays aus Objekten werden entweder auf mehrere Zeilen aufgeteilt (was die Auftragsfelder dupliziert und die Zeilenzahl ändert) oder als JSON-String serialisiert; der Unterschied zwischen null, leerem String und fehlendem Schlüssel fällt zusammen, da CSV alle drei als leeres Feld darstellt; und jede Typangabe verschwindet, da CSV-Werte reiner Text sind. Ist das JSON ein einheitliches Array flacher Objekte, ist die Konvertierung verlustfrei — andernfalls müssen Sie Abflachungsentscheidungen treffen (und dokumentieren).
Sources & references
Authoritative references cited by this piece. Verified by Buğra Sözeri on the dates shown and re-checked at every deploy.
- RFC 4180 — Common Format and MIME Type for CSV Files — Das Nächste, was CSV an einer Spezifikation hat: Quotierung, eingebettete Kommas und Zeilenumbrüche sowie die optionale Kopfzeile(as of )
- ECMA-404 — The JSON Data Interchange Syntax — Die JSON-Grammatik, einschließlich der Zahlensyntax ohne Präzisionsgrenze — Präzisionsgrenzen kommen aus den Implementierungen(as of )
- MDN — JSON.parse() and number precision — Dokumentiert, dass JavaScript JSON-Zahlen als IEEE-754-Doubles parst und dabei die Ganzzahlpräzision über 2^53 hinaus verliert(as of )
- JSON Lines specification — Das Ein-JSON-Wert-pro-Zeile-Format als streamingfreundliche Alternative zu einem einzelnen JSON-Array(as of )
Related
Published July 15, 2026