Home >Backend Development >Golang >How to Handle Non-RFC 3339 Time Formats in Go JSON Unmarshaling?
Custom Unmarshaling for Non-RFC 3339 Time Formats in Go JSON
In Go, the encoding/json package strictly adheres to RFC 3339 when deserializing time values. However, there are often situations where data comes in different time formats. This can be a problem if you want to avoid cumbersome conversions.
Using Custom Types
To handle this, you can implement the json.Marshaler and json.Unmarshaler interfaces on a custom type. This allows you to define how your type is marshaled and unmarshaled to and from JSON.
For example, the following CustomTime type allows you to unmarshal time values from various formats:
type CustomTime struct { time.Time } const ctLayout = "2006/01/02|15:04:05" func (ct *CustomTime) UnmarshalJSON(b []byte) (err error) { s := strings.Trim(string(b), "\"") if s == "null" { ct.Time = time.Time{} return } ct.Time, err = time.Parse(ctLayout, s) return } func (ct *CustomTime) MarshalJSON() ([]byte, error) { if ct.Time.IsZero() { return []byte("null"), nil } return []byte(fmt.Sprintf("\"%s\"", ct.Time.Format(ctLayout))), nil } var nilTime = (time.Time{}).UnixNano() func (ct *CustomTime) IsSet() bool { return !ct.IsZero() }
In this type:
You can use the CustomTime type in your JSON structs to handle deserialization of time values from non-RFC 3339 formats:
type Args struct { Time CustomTime } var data = ` {"Time": "2014/08/01|11:27:18"} ` func main() { a := Args{} fmt.Println(json.Unmarshal([]byte(data), &a)) fmt.Println(a.Time.String()) }
In this example, the Args struct uses the CustomTime type for the Time field. When deserializing JSON data with a non-RFC 3339 time format, the CustomTime type will handle the conversion correctly.
The above is the detailed content of How to Handle Non-RFC 3339 Time Formats in Go JSON Unmarshaling?. For more information, please follow other related articles on the PHP Chinese website!