Arbeiten mit JSON in Go: Parsen und Serialisieren von Daten

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in die Arbeit mit JSON in Go

JSON (JavaScript Object Notation) ist ein leichtgewichtiges Datenaustauschformat, das häufig in Webanwendungen, APIs und Microservices verwendet wird. Die Sprache Go (Golang) bietet eine leistungsstarke integrierte Bibliothek encoding/json, die das Parsen (Deserialisieren) und Serialisieren von Daten einfach ermöglicht. In diesem Artikel werden wir im Detail besprechen, wie man mit JSON in Go arbeitet, die wichtigsten Funktionen, Strukturen und Best Practices betrachten.



Grundlagen der Serialisierung und Deserialisierung

Serialisierung ist der Prozess der Umwandlung einer Go-Datenstruktur (z. B. einer Struktur oder eines Slices) in einen JSON-String. Deserialisierung ist die umgekehrte Umwandlung von JSON in eine Go-Struktur.



Serialisierung (Marshal)

Für die Serialisierung wird die Funktion json.Marshal() verwendet. Sie nimmt einen Go-Wert entgegen und gibt ein Byte-Slice ([]byte) mit der JSON-Darstellung zurück.

package main

import ( "encoding/json" "fmt")

type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"`}

func main() { user := User{Name: "Alexej", Age: 30, Email: "alex@example.com"} jsonData, err := json.Marshal(user) if err != nil { fmt.Println("Serialisierungsfehler:", err) return } fmt.Println(string(jsonData)) // Ausgabe: {"name":"Alexej","age":30,"email":"alex@example.com"}}

Beachten Sie die Tags json:"feldname". Sie ermöglichen die Steuerung der Schlüsselnamen in JSON sowie das Hinzufügen von Optionen wie omitempty (Feld überspringen, wenn es leer ist).



Deserialisierung (Unmarshal)

Zum Parsen von JSON in eine Go-Struktur wird die Funktion json.Unmarshal() verwendet. Sie nimmt ein Byte-Slice und einen Zeiger auf die Struktur entgegen, in die die Daten geschrieben werden sollen.

func main() {    jsonString := `{"name":"Maria","age":25,"email":"maria@example.com"}`    var user User    err := json.Unmarshal([]byte(jsonString), &user)    if err != nil {        fmt.Println("Parsing-Fehler:", err)        return    }    fmt.Printf("Name: %s, Alter: %d, Email: %s", user.Name, user.Age, user.Email)}

Wichtig: Die Struktur muss im Voraus definiert sein, und ihre Felder müssen den JSON-Schlüsseln entsprechen (unter Berücksichtigung der Tags).



Arbeiten mit beliebigen JSON-Objekten

Manchmal ist die JSON-Struktur im Voraus unbekannt oder zu komplex. In solchen Fällen kann man map[string]interface{} oder interface{} verwenden.



Verwendung von map[string]interface{}

func main() {    jsonString := `{"name":"Iwan","age":35,"address":{"city":"Moskau","street":"Lenina"}}`    var result map[string]interface{}    err := json.Unmarshal([]byte(jsonString), &result)    if err != nil {        fmt.Println("Fehler:", err)        return    }    fmt.Println(result["name"]) // Iwan    fmt.Println(result["age"])  // 35 (Typ float64)    // Für verschachtelte Objekte muss der Typ umgewandelt werden    address := result["address"].(map[string]interface{})    fmt.Println(address["city"]) // Moskau}

Der Nachteil dieses Ansatzes ist die Notwendigkeit manueller Typumwandlungen (.(map[string]interface{})), was bei Typkonflikten zu einer Panik führen kann.



Verwendung von json.RawMessage

Wenn das Parsen eines Teils von JSON verzögert werden soll, verwenden Sie json.RawMessage. Dies ermöglicht es, zuerst die Hauptstruktur zu analysieren und dann die verschachtelten Daten separat zu verarbeiten.

type Response struct {    Status string          `json:"status"`    Data   json.RawMessage `json:"data"`}

func main() { jsonString := `{"status":"ok","data":{"user":"Petr","score":100}}` var resp Response json.Unmarshal([]byte(jsonString), &resp)

// Jetzt kann Data separat analysiert werden var userData map[string]interface{} json.Unm

Blogs

Buchempfehlungen