// Created on savesnippets.com ยท https://savesnippets.com/NiwfcxgrJxOfgP package main import ( "encoding/json" "fmt" ) type Event struct { Type string `json:"type"` Timestamp int64 `json:"ts"` Data map[string]any `json:"data"` } func main() { // Marshal โ€” struct to JSON e := Event{Type: "signup", Timestamp: 1735689600, Data: map[string]any{"user_id": 42, "plan": "pro"}} b, _ := json.Marshal(e) fmt.Println(string(b)) // {"type":"signup","ts":1735689600,"data":{"plan":"pro","user_id":42}} pretty, _ := json.MarshalIndent(e, "", " ") fmt.Println(string(pretty)) // Unmarshal โ€” JSON to struct raw := []byte(`{"type":"login","ts":1735689700,"data":{"user_id":42}}`) var parsed Event if err := json.Unmarshal(raw, &parsed); err != nil { fmt.Println("err:", err) } fmt.Printf("%+v\n", parsed) // Untyped โ€” decode into map[string]any var dynamic map[string]any json.Unmarshal(raw, &dynamic) fmt.Println(dynamic["type"]) // login }