// Created on savesnippets.com ยท https://savesnippets.com/asQl8tu8fctQYr package main import ( "encoding/json" "fmt" ) type Envelope struct { Type string `json:"type"` Payload json.RawMessage `json:"payload"` // hold bytes, decode later } type SignupPayload { /* ... */ } type SignupData struct{ UserID int `json:"user_id"` } type LoginData struct{ Email string `json:"email"` } func main() { raw := []byte(`{"type":"signup","payload":{"user_id":42}}`) var env Envelope json.Unmarshal(raw, &env) switch env.Type { case "signup": var d SignupData json.Unmarshal(env.Payload, &d) fmt.Printf("signup: user_id=%d\n", d.UserID) case "login": var d LoginData json.Unmarshal(env.Payload, &d) fmt.Printf("login: email=%s\n", d.Email) } }