json-csv.de

JSON zu CSV · C#

JSON zu CSV in C#

In C# parst System.Text.Json das JSON ohne zusätzliche Pakete, für das CSV-Schreiben ist CsvHelper die etablierte Wahl. CsvHelper übernimmt Quoting, Trennzeichen und die richtige Kultur. Das folgende Beispiel verarbeitet eine Liste dynamischer Objekte und schreibt sie korrekt als CSV.

Ansatz

System.Text.Json liest das JSON in Dictionaries, CsvHelper schreibt die Tabelle mit automatischem Quoting.

Code-Beispiel

using System.Globalization;
using System.Text;
using System.Text.Json;
using CsvHelper;
using CsvHelper.Configuration;

string json = File.ReadAllText("daten.json");
var daten = JsonSerializer.Deserialize<List<Dictionary<string, object?>>>(json)!;

var spalten = daten
    .SelectMany(o => o.Keys)
    .Distinct()
    .ToList();

// Semikolon als Trenner für deutsches Excel, Kultur unabhängig vom System
var config = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = ";" };

using var writer = new StreamWriter("daten.csv", false, new UTF8Encoding(true)); // true: mit BOM
using var csv = new CsvWriter(writer, config);

foreach (var spalte in spalten)
    csv.WriteField(spalte);
csv.NextRecord();

foreach (var zeile in daten)
{
    foreach (var spalte in spalten)
        csv.WriteField(zeile.TryGetValue(spalte, out var v) ? v?.ToString() ?? "" : "");
    csv.NextRecord();
}

Console.WriteLine("daten.csv geschrieben");

Hinweise

Das Beispiel setzt ein aktuelles .NET mit Implicit Usings voraus, sonst brauchen Sie zusätzlich using System.IO und System.Linq. CsvHelper setzt Anführungszeichen automatisch, sobald ein Feld das Trennzeichen, ein Anführungszeichen oder einen Zeilenumbruch enthält, und verdoppelt innenliegende Anführungszeichen. Ohne Konfiguration wählt CsvHelper das Trennzeichen aus der Kultur: Unter deutscher Kultur wäre es das Semikolon, unter InvariantCulture das Komma. Im Beispiel steht der Delimiter deshalb ausdrücklich in der CsvConfiguration. UTF8Encoding mit dem Argument true schreibt ein BOM, das Excel die UTF-8-Kodierung signalisiert. System.Text.Json liefert die Werte als JsonElement. Deren ToString gibt bei Texten den Text und bei Objekten und Arrays die rohe JSON-Notation zurück, was für eingebettete Strukturen meist genau richtig ist. Für feste Modelle können Sie statt Dictionary eine eigene Klasse deserialisieren und CsvHelper die Spalten erzeugen lassen.

Anzeige

FAQ

Häufige Fragen

Warum steht der Delimiter in der Konfiguration?

Ohne Angabe nutzt CsvHelper das Listentrennzeichen der Kultur. Das ist unter deutscher Kultur das Semikolon und unter InvariantCulture das Komma. Wer ein bestimmtes Format braucht, setzt den Delimiter deshalb selbst.

Brauche ich CsvHelper oder geht es ohne?

Es geht auch mit StringBuilder und eigenem Escaping. CsvHelper nimmt Ihnen aber Quoting, Kultur und Sonderfälle ab und ist über NuGet schnell eingebunden, daher lohnt es sich fast immer.

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