JSON-Verarbeitung in Go (Golang): encoding/json und Alternativen

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

JSON-Verarbeitung in Go (Golang): Von den Grundlagen bis zu fortgeschrittenen Techniken



Go (Golang) bietet einen leistungsstarken und intuitiven Satz von Werkzeugen für die Arbeit mit JSON. Die Standardbibliothek encoding/json deckt 95% der Aufgaben ab, und für hochlastige Projekte gibt es leistungsfähigere Alternativen. In diesem Artikel werden wir alle Aspekte der JSON-Verarbeitung in Go behandeln: von der grundlegenden Serialisierung bis hin zu benutzerdefinierten Parsern und Optimierung.



1. Grundlagen: Die Standardbibliothek encoding/json



In Go wird JSON über das Paket encoding/json verarbeitet. Die grundlegenden Operationen sind Marshalling (Serialisierung in JSON) und Unmarshalling (Deserialisierung aus JSON).



1.1. Marshalling (struct → JSON)



Zur Umwandlung einer Go-Struktur in JSON wird die Funktion json.Marshal() verwendet:



package main

import ( "encoding/json" "fmt" "log")

type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` // omitempty - überspringen, wenn leer}

func main() { user := User{ Name: "Ivan Petrov", Age: 30, Email: "ivan@example.com", }

jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) }

fmt.Println(string(jsonData)) // {"name":"Ivan Petrov","age":30,"email":"ivan@example.com"}}


Wichtig: Die Felder der Struktur müssen exportierbar sein (mit Großbuchstaben beginnen). Tags wie json:"fieldname" steuern die Benennung der Felder in JSON.



1.2. Unmarshalling (JSON → struct)



Für die umgekehrte Umwandlung wird json.Unmarshal() verwendet:



func main() {    jsonString := `{"name":"Anna","age":25,"email":"anna@mail.com"}`        var user User    err := json.Unmarshal([]byte(jsonString), &user)    if err != nil {        log.Fatal(err)    }

fmt.Printf("Name: %s, Alter: %d", user.Name, user.Age) // Name: Anna, Alter: 25}


2. Arbeiten mit verschachtelten Strukturen und Arrays



JSON enthält oft verschachtelte Objekte und Arrays. In Go wird dies durch verschachtelte Strukturen und Slices abgebildet:



type Address struct {    City    string `json:"city"`    Street  string `json:"street"`    ZipCode string `json:"zip_code"`}

type Company struct { Name string `json:"name"` Employees []User `json:"employees"` Address Address `json:"address"`}

func main() { companyJSON := `{ "name": "TechCorp", "employees": [ {"name":"Oleg","age":28,"email":"oleg@tech.com"}, {"name":"Maria","age":32,"email":"maria@tech.com"} ], "address": { "city": "Moskau", "street": "Twerskaja, 10", "zip_code": "101000" } }`

var company Company json.Unmarshal([]byte(companyJSON), &company) fmt.Printf("Unternehmen: %s, Stadt: %s, Mitarbeiter: %d", company.Name, company.Address.City, len(company.Employees))}


3. Fortgeschrittene Techniken



3.1. Benutzerdefinierte Serialisierung (Marshaler/Unmarshaler-Interfaces)



Manchmal muss man steuern, wie ein Typ in JSON umgewandelt wird. Dazu implementiert man die Interfaces json.Marshaler und json.Unmarshaler:



type CustomTime struct {    time.Time}

const layout = "2006-01-02T15:04:05Z"

func (ct CustomTime) MarshalJSON() ([]byte, error) { return json.Marshal(ct.Format(layout))}

func (ct *CustomTime) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } t, err := time.Parse(layout, s) if err != nil { return err } ct.Time = t return nil}

type Event struct { Title string `json:"title"` Date CustomTime `js

Empfehlungen