JSON / Custom JSON marshaling / Essential Go

Run Settings
LanguageGo
Language Version
Run Command
package main import ( "encoding/json" "fmt" "log" "time" ) func notCustom() { type Event struct { What string When time.Time } e := Event{ What: "earthquake", When: time.Now(), } d, err := json.Marshal(&e) if err != nil { log.Fatalf("json.MarshalIndent failed with '%s'\n", err) } fmt.Printf("Standard time JSON: %s\n", string(d)) } type customTime time.Time const customTimeFormat = `"2006-02-01"` func (ct customTime) MarshalJSON() ([]byte, error) { t := time.Time(ct) s := t.Format(customTimeFormat) return []byte(s), nil } func (ct *customTime) UnmarshalJSON(d []byte) error { t, err := time.Parse(customTimeFormat, string(d)) if err != nil { return err } *ct = customTime(t) return nil } type Event2 struct { What string When customTime } func custom() { e := Event2{ What: "earthquake", When: customTime(time.Now()), } d, err := json.Marshal(&e) if err != nil { log.Fatalf("json.Marshal failed with '%s'\n", err) } fmt.Printf("\nCustom time JSON: %s\n", string(d)) var decoded Event2 err = json.Unmarshal(d, &decoded) if err != nil { log.Fatalf("json.Unmarshal failed with '%s'\n", err) } t := time.Time(decoded.When) fmt.Printf("Decoded custom time: %s\n", t.Format(customTimeFormat)) } func main() { notCustom() custom() }
Editor Settings
Theme
Key bindings
Full width
Lines