JSON-Verarbeitung in Go (Golang): Vollständige Anleitung
Go (Golang) ist eine moderne, kompilierte Programmiersprache, die bei Google entwickelt wurde. Eine ihrer Stärken ist die integrierte Unterstützung des JSON-Formats über das Standardpaket encoding/json. Im Gegensatz zu vielen anderen Sprachen, bei denen die Installation von Drittanbieter-Bibliotheken erforderlich ist, ist die JSON-Verarbeitung in Go "out of the box" verfügbar und zeichnet sich durch hohe Leistung und strenge Typisierung aus.
In diesem Artikel werden wir alle Aspekte der Arbeit mit JSON in Go im Detail behandeln: vom einfachen Parsen bis hin zu komplexen Szenarien mit benutzerdefinierten Typen und Stream-Verarbeitung.
Grundlagen: Kodieren und Dekodieren von JSON
Das Paket encoding/json bietet zwei Hauptfunktionen: json.Marshal() zur Serialisierung von Go-Strukturen in JSON und json.Unmarshal() zur Deserialisierung von JSON zurück in Strukturen.
Beispiel: Serialisierung einer Struktur in JSON
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: "Ivan Petrov", Age: 30, Email: "ivan@example.com", }
jsonData, err := json.Marshal(user) if err != nil { fmt.Println("Serialisierungsfehler:", err) return }
fmt.Println(string(jsonData)) // Ausgabe: {"name":"Ivan Petrov","age":30,"email":"ivan@example.com"}}Beispiel: Deserialisierung von JSON in eine Struktur
func main() { jsonString := `{"name":"Anna Smirnova","age":25,"email":"anna@example.com"}` var user User err := json.Unmarshal([]byte(jsonString), &user) if err != nil { fmt.Println("Deserialisierungsfehler:", err) return }
fmt.Printf("Name: %s, Alter: %d, E-Mail: %s", user.Name, user.Age, user.Email)}Struktur-Tags (Struct Tags)
Struktur-Tags in Go ermöglichen die Steuerung, wie Felder in JSON serialisiert werden. Dies ist ein leistungsstarker Mechanismus zur Anpassung von Feldnamen, zum Überspringen leerer Werte und für andere Optionen.
Wichtige Tag-Optionen:
json:"name"— legt den Feldnamen in JSON festjson:"-"— schließt das Feld vollständig aus JSON ausjson:"name,omitempty"— überspringt das Feld, wenn es einen Nullwert enthält (0, "", false, nil)json:"name,string"— wandelt ein numerisches Feld zwangsweise in einen String um
Beispiel mit verschiedenen Tags:
type Product struct { ID int `json:"id"` Title string `json:"title"` Description string `json:"description,omitempty"` Price float64 `json:"price,string"` SecretKey string `json:"-"`}
func main() { product := Product{ ID: 101, Title: "Laptop", Description: "", Price: 899.99, SecretKey: "sk-12345", }
jsonData, _ := json.MarshalIndent(product, "", " ") fmt.Println(string(jsonData)) // Ausgabe: // { // "id": 101, // "title": "Laptop", // "price": "899.99" // }}Arbeit mit beliebigen JSON-Daten (interface{})
Manchmal ist die Struktur der JSON-Daten im Voraus unbekannt. In solchen Fällen kann der Typ interface{} oder map[string]interface{} verwendet werden.
func main() { jsonString := `{"name":"Test","values":[1,2,3],"active":true,"metadata":{"version":2}}` var data map[string]interface{} err := json.Unmarshal([]byte(jsonString), &data) if err != nil { fmt.Println("Fehler:", err) return }
// Zugriff auf Werte mit Typumwandlung name := data["name"].(string) values := data["values"].([]interface{})