json.csv.de

JSON zu CSV · Go

JSON zu CSV in Go

Go deckt beide Schritte mit der Standardbibliothek ab: encoding/json parst die Quelle, encoding/csv schreibt das Ergebnis samt korrektem Quoting. Es braucht kein externes Modul. Das folgende Programm liest eine JSON-Datei mit beliebigen Schlüsseln und schreibt eine saubere CSV-Datei zurück.

Ansatz

encoding/json dekodiert in eine Map-Liste, encoding/csv schreibt mit automatischem Quoting.

Code-Beispiel

package main

import (
	"encoding/csv"
	"encoding/json"
	"os"
)

func main() {
	roh, _ := os.ReadFile("daten.json")

	var daten []map[string]interface{}
	json.Unmarshal(roh, &daten)

	// Spalten in Reihenfolge des ersten Auftretens sammeln
	var spalten []string
	gesehen := map[string]bool{}
	for _, obj := range daten {
		for k := range obj {
			if !gesehen[k] {
				gesehen[k] = true
				spalten = append(spalten, k)
			}
		}
	}

	f, _ := os.Create("daten.csv")
	defer f.Close()

	w := csv.NewWriter(f)
	defer w.Flush()

	w.Write(spalten)
	for _, obj := range daten {
		zeile := make([]string, len(spalten))
		for i, k := range spalten {
			if v, ok := obj[k]; ok && v != nil {
				zeile[i] = toString(v)
			}
		}
		w.Write(zeile)
	}
}

func toString(v interface{}) string {
	switch t := v.(type) {
	case string:
		return t
	default:
		b, _ := json.Marshal(v)
		return string(b)
	}
}

Hinweise

Der csv.Writer von Go setzt Anführungszeichen automatisch, sobald ein Feld ein Komma, ein Anführungszeichen, einen Zeilenumbruch oder ein führendes Leerzeichen enthält, das Escaping ist also abgedeckt. Wichtig ist der Aufruf von Flush, hier per defer abgesichert, sonst bleiben die letzten Zeilen im Puffer und landen nie auf der Platte. Da JSON-Zahlen in Go als float64 ankommen, würde eine naive Umwandlung große Ganzzahlen in wissenschaftlicher Notation darstellen, deshalb serialisiert die toString-Hilfsfunktion alles außer Strings über json.Marshal, was Zahlen und verschachtelte Objekte korrekt abbildet. Die map-basierte Dekodierung erlaubt beliebige Strukturen, für feste Schemata sind typisierte Structs mit json-Tags schneller und sicherer. Das Trennzeichen lässt sich über das Feld Comma des Writers ändern, etwa auf ein Semikolon. Go schreibt UTF-8 standardmäßig, sodass Umlaute ohne Zusatzarbeit korrekt sind.

Anzeige

FAQ

Häufige Fragen

Warum darf ich Flush nicht vergessen?

Der csv.Writer puffert die Ausgabe. Ohne abschließendes Flush, hier per defer w.Flush(), fehlen die letzten Zeilen in der Datei. Das ist ein häufiger Fehler bei der ersten Nutzung.

Wie ändere ich das Trennzeichen auf Semikolon?

Setze nach dem Erstellen w.Comma = ';'. Damit schreibt Go semikolongetrennte Werte, was sich für den direkten Import in deutsches Excel anbietet.

Du willst nicht selbst programmieren? Der JSON-zu-CSV-Converter wandelt deine Daten direkt im Browser um, ohne Upload und ohne Installation.

Anzeige
Anzeige
Anzeige
Anzeige