JSON zu CSV · PHP
JSON zu CSV in PHP
PHP bietet mit fputcsv eine Funktion, die das Schreiben von CSV samt korrektem Escaping komplett übernimmt. Zusammen mit json_decode brauchst du nur wenige Zeilen, um eine JSON-Datei in eine Tabelle zu verwandeln. Das eignet sich gut für Exporte aus Webanwendungen oder CLI-Skripte.
Ansatz
json_decode mit assoziativen Arrays, fputcsv schreibt jede Zeile mit automatischem Quoting.
Code-Beispiel
<?php
$json = file_get_contents("daten.json");
$daten = json_decode($json, true); // true: assoziative Arrays
if (empty($daten)) {
exit("Keine Daten gefunden");
}
// Spalten aus dem ersten Objekt übernehmen
$spalten = array_keys($daten[0]);
$out = fopen("daten.csv", "w");
// BOM für Excel, damit Umlaute stimmen
fwrite($out, "\xEF\xBB\xBF");
fputcsv($out, $spalten);
foreach ($daten as $zeile) {
$werte = [];
foreach ($spalten as $key) {
$werte[] = $zeile[$key] ?? "";
}
fputcsv($out, $werte);
}
fclose($out);
echo "daten.csv geschrieben"; Hinweise
fputcsv setzt Anführungszeichen automatisch, wenn ein Wert das Trennzeichen, ein Anführungszeichen oder einen Zeilenumbruch enthält, und verdoppelt innenliegende Anführungszeichen. Das manuelle Escaping fällt damit weg. Das vorangestellte UTF-8-BOM \xEF\xBB\xBF sorgt dafür, dass Excel deutsche Umlaute korrekt anzeigt, ohne das BOM interpretiert es die Datei oft als Windows-1252. Ab PHP 8.1 kannst du bei fputcsv das Escape-Zeichen explizit auf einen leeren String setzen, um das nicht standardkonforme Backslash-Escaping abzuschalten, was Importe in andere Systeme verlässlicher macht. Verschachtelte Werte aus dem JSON, also Arrays oder Objekte, musst du vor dem Schreiben mit json_encode in einen String umwandeln, sonst löst fputcsv eine Warnung aus. Der Null-Koaleszenz-Operator im Beispiel fängt fehlende Schlüssel ab.
FAQ
Häufige Fragen
Warum erscheinen Umlaute in Excel als kryptische Zeichen?
Excel erwartet bei UTF-8 ein BOM. Schreibe vor der ersten Zeile \xEF\xBB\xBF in die Datei, dann werden ä, ö, ü und ß korrekt dargestellt.
Wie schicke ich das CSV direkt als Download an den Browser?
Setze die Header Content-Type: text/csv und Content-Disposition: attachment, öffne dann mit fopen die Ausgabe php://output statt einer Datei und schreibe mit fputcsv dorthin.
Du willst nicht selbst programmieren? Der JSON-zu-CSV-Converter wandelt deine Daten direkt im Browser um, ohne Upload und ohne Installation.