Home >Backend Development >Golang >How to Handle Non-RFC 3339 Time Formats in Go JSON Unmarshaling?

How to Handle Non-RFC 3339 Time Formats in Go JSON Unmarshaling?

Linda Hamilton
Linda HamiltonOriginal
2024-12-26 00:22:09993browse

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:

  • The UnmarshalJSON method parses time values from a custom format ("2006/01/02|15:04:05").
  • The MarshalJSON method outputs the time value in the same custom format.
  • The IsSet method checks if the time value is set (non-zero).

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn