JSON zu CSV · Java
JSON zu CSV in Java
In Java übernimmt die Jackson-Bibliothek das Parsen des JSON. Das Schreiben des CSV lässt sich mit wenig Code selbst erledigen oder über das Modul jackson-dataformat-csv automatisieren. Das folgende Beispiel kommt mit jackson-databind aus und kümmert sich selbst um das Quoting der Felder.
Ansatz
Jackson ObjectMapper liest das JSON, eine kleine Hilfsmethode schreibt RFC-4180-konformes CSV.
Code-Beispiel
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
public class JsonZuCsv {
static final String TRENNER = ";";
static String escape(String s) {
if (s.contains(TRENNER) || s.contains("\"") || s.contains("\n") || s.contains("\r")) {
return "\"" + s.replace("\"", "\"\"") + "\"";
}
return s;
}
static String zelle(JsonNode v) {
if (v == null || v.isNull()) return "";
if (v.isContainerNode()) return v.toString(); // Objekte und Arrays als JSON-Text
return v.asText();
}
public static void main(String[] args) throws Exception {
JsonNode root = new ObjectMapper().readTree(new File("daten.json"));
LinkedHashSet<String> spalten = new LinkedHashSet<>();
for (JsonNode o : root) o.fieldNames().forEachRemaining(spalten::add);
try (Writer w = new OutputStreamWriter(
new FileOutputStream("daten.csv"), StandardCharsets.UTF_8)) {
w.write("\uFEFF"); // BOM für Excel
List<String> kopf = new ArrayList<>();
for (String k : spalten) kopf.add(escape(k));
w.write(String.join(TRENNER, kopf) + "\r\n");
for (JsonNode o : root) {
List<String> werte = new ArrayList<>();
for (String k : spalten) werte.add(escape(zelle(o.get(k))));
w.write(String.join(TRENNER, werte) + "\r\n");
}
}
}
}
Hinweise
Jackson liest das JSON als JsonNode-Baum. Das ist robust gegen unterschiedliche Objektstrukturen, weil Sie die Felder dynamisch über fieldNames abfragen. Das LinkedHashSet sammelt alle Spalten in der Reihenfolge ihres ersten Auftretens, sodass die Kopfzeile stabil bleibt, auch wenn nicht jedes Objekt jeden Schlüssel hat. Der OutputStreamWriter mit StandardCharsets.UTF_8 erzwingt UTF-8 unabhängig von der Plattform-Vorgabe. Die Hilfsmethode zelle gibt für null ein leeres Feld aus und schreibt verschachtelte Knoten als JSON-Text, denn asText liefert für JSON-null den Text null und für Objekte und Arrays einen leeren String. Wer das Schreiben nicht selbst machen will, fügt jackson-dataformat-csv hinzu und nutzt CsvMapper mit einem CsvSchema. Der Writer wird durch try-with-resources am Ende sicher geschlossen.
FAQ
Häufige Fragen
Soll ich jackson-dataformat-csv nutzen oder selbst schreiben?
Für einfache, flache Daten genügt das manuelle Schreiben wie im Beispiel. Das CSV-Modul von Jackson lohnt sich, wenn Sie Schemas, feste Spaltenreihenfolgen oder Quoting-Optionen brauchen, ohne sie selbst zu pflegen.
Warum sind meine Umlaute in der Datei kaputt?
Ohne Angabe verwenden ältere Java-Versionen das Plattform-Encoding. Schreiben Sie immer über einen OutputStreamWriter mit StandardCharsets.UTF_8, dann bleiben ä, ö, ü und ß erhalten.
Sie wollen nicht selbst programmieren? Der JSON-CSV-Konverter wandelt Ihre Daten direkt im Browser um, ohne Upload und ohne Installation.