json-csv.de

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.

Anzeige

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.

Anzeige
Anzeige
Anzeige
Anzeige