CSV und JSON sind wahrscheinlich die zwei häufigsten Datenformate, denen Sie als Entwickler begegnen. CSV-Dateien tauchen in Tabellenkalkulationsexporten, Datenbank-Dumps und Data-Science-Pipelines auf. JSON ist überall im Web — REST-APIs, Konfigurationsdateien, NoSQL-Datenbanken. Beide sind Klartext, beide sind menschenlesbar, und beide erledigen die Arbeit. Aber sie wurden für verschiedene Datenformen gebaut, und das falsche zu wählen, erzeugt echte Kopfschmerzen. Dieser Artikel geht durch die Kernunterschiede, zeigt konkrete Beispiele, wo jedes Format glänzt (und bricht), und gibt Ihnen einen praktischen Entscheidungsleitfaden für die Wahl zwischen ihnen.
Der Kernunterschied: Tabellen vs. Bäume
CSV — definiert in RFC 4180 — ist ein flaches, tabellarisches Format. Jede Zeile hat dieselben Spalten, jeder Wert ist eine Zeichenkette. Das war's. Es bildet perfekt auf eine Tabellenkalkulation oder eine Datenbanktabelle ab: Zeilen nach unten, Spalten quer.
JSON — spezifiziert in RFC 8259 und beschrieben auf json.org — ist ein hierarchisches Format. Werte können Objekte, Arrays, Strings, Zahlen, Booleans oder null sein. Objekte verschachteln sich in Objekte, Arrays halten verschiedene Formen. Es bildet auf ab, wie Daten tatsächlich im Code existieren — Datensätze mit Beziehungen, Listen verschiedener Dinge, typisierte Werte.
Dieselben Daten in beiden Formaten
Hier wird der Unterschied konkret. Stellen Sie sich einen Produktkatalog für einen E-Commerce-Shop vor. Produkte haben einen Namen, Preis und ob sie auf Lager sind — einfach. Aber sie haben auch Varianten (Größen, Farben) und Attribute (Material, Gewicht). Schauen wir, wie diese Daten in beiden Formaten aussehen.
In JSON ist das natürlich:
[
{
"id": "SHOE-001",
"name": "Trail Runner Pro",
"price": 129.99,
"inStock": true,
"attributes": {
"material": "mesh",
"weightGrams": 280
},
"variants": [
{ "size": 9, "color": "black", "sku": "TR-9-BLK", "qty": 12 },
{ "size": 9, "color": "white", "sku": "TR-9-WHT", "qty": 4 },
{ "size": 10, "color": "black", "sku": "TR-10-BLK", "qty": 7 }
]
},
{
"id": "SHOE-002",
"name": "City Walker",
"price": 89.99,
"inStock": true,
"attributes": {
"material": "leather",
"weightGrams": 340
},
"variants": [
{ "size": 8, "color": "brown", "sku": "CW-8-BRN", "qty": 6 },
{ "size": 9, "color": "brown", "sku": "CW-9-BRN", "qty": 15 }
]
}
]Versuchen Sie nun, das in eine CSV zu packen. Sie haben zwei Optionen, beide unhandlich. Option eins: Alles abflachen und Elterndaten für jede Variantenzeile wiederholen:
product_id,product_name,price,inStock,material,weightGrams,variant_size,variant_color,sku,qty
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,9,black,TR-9-BLK,12
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,9,white,TR-9-WHT,4
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,10,black,TR-10-BLK,7
SHOE-002,City Walker,89.99,true,leather,340,8,brown,CW-8-BRN,6
SHOE-002,City Walker,89.99,true,leather,340,9,brown,CW-9-BRN,15Produktname, Preis und Attribute werden für jede Variante wiederholt. Das ist Datenredundanz — kein großes Problem für fünf Zeilen, aber bei einem Katalog von 50.000 Produkten mit je 8 Varianten summiert sich das. Option zwei: Die Varianten als JSON-String innerhalb einer CSV-Spalte serialisieren — aber jetzt betten Sie JSON in CSV ein, um die Einschränkungen von CSV zu umgehen, was ein Code-Geruch ist.
Wo CSV gewinnt
Trotz dieser Einschränkung ist CSV in mehreren gängigen Szenarien die genuinly bessere Wahl.
- Tabellenkalkulationen und BI-Tools. Excel, Google Sheets, Tableau, Looker, Power BI — alle öffnen CSV nativ mit einem Klick. Kein Import-Assistent, kein zu definierendes Schema, kein Transformationsschritt. Wenn Ihre Stakeholder in Tabellenkalkulationen leben, ist CSV der Weg des geringsten Widerstands.
- Reine flache Daten. Wenn Ihre Daten wirklich eine Tabelle sind — Analytics-Events, Transaktionslogs, Sensormessungen, Benutzerexporte — ist CSV kleiner und einfacher. Keine wiederholten Schlüssel, keine Klammern, kein Rauschen.
- Datenbankimport/-export. Jede SQL-Datenbank hat einen
COPY FROM CSV-Befehl oder ein Äquivalent. Es ist das Standard-Austauschformat für das Massenladen von Daten und ist um Größenordnungen schneller als INSERT-Anweisungen. - pandas und Data Science.
pandas.read_csv()ist eine der am häufigsten verwendeten Funktionen in der Python-Datenarbeit. Das gesamte Ökosystem — NumPy, scikit-learn, Polars — behandelt CSV als erstklassiges Eingabeformat. - Dateigröße für große flache Tabellen. Ohne Schlüsselnamen in jeder Zeile ist CSV kleiner für breite Tabellen mit vielen Zeilen. Eine Million-Zeilen-CSV von Analytics-Events wird das entsprechende JSON-Array komfortabel schlagen.
Wo JSON gewinnt
- Verschachtelte und hierarchische Daten. Sobald Ihre Daten irgendeine Struktur über eine flache Tabelle hinaus haben — verschachtelte Objekte, Arrays verschiedener Formen, verwandte Datensätze — verarbeitet JSON es natürlich. CSV kann das nicht darstellen, ohne Informationen zu verlieren oder Redundanz zu erzeugen.
- Typenerhaltung. In CSV ist alles eine Zeichenkette.
true,42,nullund"true"sehen alle gleich aus. Sie müssen Typen auf der Empfängerseite ableiten, was zu Bugs führt. JSON hat native Booleans, Zahlen und null.inStock: trueist eindeutig ein Boolean — kein Raten erforderlich. - REST-APIs und das Web. JSON ist das native Datenformat des Webs. Jede HTTP-Client-Bibliothek, jede Fetch-API des Browsers, jede REST- und GraphQL-API spricht JSON. CSV über HTTP zu senden ist möglich, aber ungewöhnlich — Sie bräuchten benutzerdefiniertes Parsing an beiden Enden.
- NoSQL-Datenbanken. MongoDB, DynamoDB, Firestore, Elasticsearch, CouchDB — alle verwenden JSON (oder einen binären Obersatz wie BSON) als natives Dokumentformat. Sie schreiben JSON rein und erhalten JSON zurück.
- Konfigurationsdateien.
package.json,tsconfig.json,manifest.json— Tooling-Konfiguration hat sich auf JSON standardisiert, weil es verschachtelte Strukturen unterstützt und leicht programmgesteuert zu generieren und zu validieren ist. - Schema-Validierung. JSON Schema lässt Sie die genaue Form eines Dokuments definieren und Daten dagegen validieren — Typprüfungen, Pflichtfelder, Musterübereinstimmung, Array-Einschränkungen. CSV hat keinen entsprechenden Standard.
Dateigröße: Die wahre Geschichte
Die Behauptung "CSV ist kleiner" ist in einem spezifischen Fall wahr: große flache Tabellen mit vielen Zeilen. Nehmen Sie 100.000 Analytics-Events, jedes mit acht festen Feldern. In CSV erscheinen die Feldnamen einmal in der Kopfzeile. In JSON erscheinen sie auf jedem Objekt. Diese Wiederholung summiert sich — das JSON-Array könnte 30–50% größer sein als das äquivalente CSV.
Drehen Sie das Szenario auf verschachtelte Daten um und die Mathematik ändert sich. Das abgeflachte CSV unseres Schuhkatalogs wiederholt den Produktnamen, Preis und Attribute auf jeder Variantenzeile. Die JSON-Version speichert jedes Produkt einmal. Bei tief verschachtelten Daten mit vielen wiederholten Elternfeldern kann JSON tatsächlich kleiner sein.
In der Praxis komprimieren beide Formate extrem gut mit gzip, wenn die Dateigröße wirklich eine Sorge ist — die wiederholten Schlüsselnamen in JSON und wiederholte Zeilenwerte in CSV komprimieren beide stark. Gzip-komprimiertes JSON über HTTP zu liefern ist Standardpraxis, und der Größenunterschied wird nach Komprimierung normalerweise vernachlässigbar.
Tool-Vergleich
Die Tool-Geschichte für jedes Format spiegelt wider, wo es am meisten verwendet wird.
CSV-Tools: Excel, Google Sheets und LibreOffice Calc öffnen es nativ.
Die pandas-Bibliothek macht
CSV zum Standard für die Datenanalyse in Python. Jede relationale Datenbank hat einen CSV-Import/Export-Befehl.
Kommandozeilen-Tools wie csvkit und xsv lassen Sie CSV-Dateien filtern, joinen
und aggregieren, ohne Code zu schreiben. Der MIME-Typ ist text/csv, bei IANA registriert.
JSON-Tools: Jede Programmiersprache hat einen eingebauten oder Standard-Bibliotheks-JSON-Parser.
JSON.parse() in JavaScript, json.loads() in Python, encoding/json
in Go, serde_json in Rust. Die MDN-JSON-Referenz ist
eine der meistbesuchten Seiten auf MDN. Kommandozeile: jq ist unverzichtbar für das Abfragen
und Transformieren von JSON. IDEs pretty-printen und validieren es automatisch.
Wenn Sie mit Datenpipelines arbeiten, die beide Welten umspannen — JSON-API-Antworten in ein Data Warehouse laden oder Datenbankdatensätze für eine Tabellenkalkulation exportieren — werden Sie regelmäßig zwischen beiden konvertieren. Der CSV zu JSON-Konverter und JSON zu CSV-Konverter erledigen das schnell. Zum Aufräumen von Rohdateien vor der Verarbeitung sind der CSV-Formatierer und JSON-Formatierer es wert, als Lesezeichen gespeichert zu werden.
Das Hybrid: JSON Lines (NDJSON)
Es gibt eine dritte Option, die es wert ist zu kennen: JSON Lines, auch NDJSON (Newline-Delimited JSON) genannt. Die Idee ist einfach — ein vollständiges JSON-Objekt pro Zeile, kein umgebendes Array.
{"id":"SHOE-001","name":"Trail Runner Pro","price":129.99,"inStock":true,"variantCount":3}
{"id":"SHOE-002","name":"City Walker","price":89.99,"inStock":true,"variantCount":2}
{"id":"SHOE-003","name":"Summit Hiker","price":159.99,"inStock":false,"variantCount":5}Dieses Format bietet das Beste aus beiden Welten für bestimmte Anwendungsfälle. Wie CSV können Sie
es zeilenweise streamen und verarbeiten, ohne die gesamte Datei in den Speicher zu laden — kritisch für große
Log-Dateien oder Datenpipeline-Ausgaben. Wie JSON kann jede Zeile ein anderes Schema haben und Typen
beibehalten. Sie können Standard-Unix-Tools (grep, wc -l, head)
damit verwenden, aber auch jede Zeile durch jq für strukturierte Abfragen leiten.
NDJSON wird häufig für Log-Aggregation (es ist das Standard-Ausgabeformat für viele strukturierte Logger), Datenpipeline-Stufen und ML-Trainingsdatenexporte verwendet. Wenn Sie ein Skript schreiben, das Millionen von Datensätzen verarbeitet und jeder Datensatz ein JSON-Objekt ist, ist NDJSON normalerweise die richtige Wahl gegenüber einem riesigen JSON-Array — Sie vermeiden das Laden des Ganzen in den Speicher und können leicht von einem Checkpoint fortsetzen.
import json
# Process a large NDJSON file without loading it all into memory
with open('products.ndjson', 'r') as f:
for line in f:
product = json.loads(line.strip())
if product['inStock'] and product['price'] < 100:
print(f"{product['name']} — ${product['price']}")Entscheidungsleitfaden: CSV vs. JSON
Hier ist die praktische Version. Wenn Sie zwischen beiden wählen, stellen Sie sich diese Fragen:
- Sind Ihre Daten wirklich flach (keine Verschachtelung, keine Arrays)? Wenn ja, ist CSV einfacher. Wenn nein, JSON.
- Wird ein Nicht-Entwickler diese Datei verbrauchen? Analysten in Excel? Business-Anwender in Google Sheets? Verwenden Sie CSV.
- Bedienen oder konsumieren Sie eine HTTP-API? Verwenden Sie JSON. Ohne Wenn und Aber.
- Führen Sie einen Massen-Datenbankimport oder -export durch? Verwenden Sie CSV — jede Datenbank unterstützt es nativ.
- Haben die Daten gemischte Typen (Booleans, Zahlen, Nulls)? Verwenden Sie JSON, um Typen-Inferenz-Bugs auf der Empfängerseite zu vermeiden.
- Wird die Datei zeilenweise in einer Streaming-Pipeline verarbeitet? Erwägen Sie NDJSON als Mittelweg.
- Speichern Sie Konfiguration? Verwenden Sie JSON (oder YAML, wenn Kommentare wichtig sind).
- Muss das Schema pro Datensatz variieren? JSON. CSV erzwingt dieselben Spalten in jeder Zeile.
Zusammenfassung
CSV und JSON konkurrieren nicht wirklich — sie lösen verschiedene Probleme. CSV ist das richtige Werkzeug, wenn Ihre Daten eine Tabelle sind und Sie maximale Kompatibilität mit Tabellenkalkulationen und Datenbank-Tools wünschen. JSON ist das richtige Werkzeug, wenn Ihre Daten Struktur, Typen oder Verschachtelung haben und wenn Sie mit APIs oder Anwendungen kommunizieren.
Die Entscheidung ist normalerweise nicht schwer, sobald Sie die tatsächliche Form der Daten betrachten. Flache Reihen von Sensormessungen? CSV. Eine API-Antwort mit verschachtelten Benutzerprofilen und eingebetteten Bestellhistorien? JSON. Ein Streaming-Log strukturierter Events? NDJSON. Passen Sie das Format an die Form der Daten und die Tools an beiden Enden an, und Sie werden selten falsch liegen.