package main import ( "database/sql/driver" "encoding/json" "fmt" "time" ) type Duration struct { time.Duration } func (d Duration) MarshalJSON() ([]byte, error) { return json.Marshal(d.String()) } func (d *Duration) UnmarshalJSON(b []byte) error { var v interface{} if err := json.Unmarshal(b, &v); err != nil { return err } switch value := v.(type) { case float64: d.Duration = time.Duration(value) return nil case string: var err error d.Duration, err = time.ParseDuration(value) if err != nil { return err } return nil default: return fmt.Errorf("invalid duration") } } func (d *Duration) Scan(value interface{}) error { str, ok := value.(string) if !ok { return fmt.Errorf("failed to unmarshal string value: %v", value) } var err error d.Duration, err = time.ParseDuration(str) return err } func (d Duration) Value() (driver.Value, error) { return d.Duration.String(), nil } func (Duration) GormDataType() string { return "TEXT" }