首頁 >後端開發 >Golang >如何在 Go 中自訂 JSON 時間解組以處理非 RFC 3339 格式?

如何在 Go 中自訂 JSON 時間解組以處理非 RFC 3339 格式?

Linda Hamilton
Linda Hamilton原創
2024-12-18 21:09:13992瀏覽

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

在Go 中自訂JSON 時間解組

處理包含時間值的JSON 資料時,Go 中的encoding/json 套件可能會受到限制如果時間格式不符合RFC 3339。雖然可以手動將時間轉換為 RFC 3339 格式解析,有一種更有效的方法。

實作 Marshaler/Unmarshaler 介面

要處理自訂時間格式,請建立一個實作 json.Marshaler 和 json 的自訂類型。解組器介面。這允許您定義時間值應如何序列化和反序列化。

這是一個名為CustomTime 的範例自訂類型:

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()
}

在此自訂類型中:

  • UnmarshalJSON 使用指定的自訂將JSON 字串轉換為time.Time 值
  • MarshalJSON使用相同的自訂佈局將 time.Time 值轉換為 JSON 字串。
  • IsSet 是一個可選方法,用於檢查 CustomTime 值是否已設定(不為零)。

使用

自訂時間後type 定義後,它可以用作結構體欄位來反序列化具有自訂時間格式的 JSON 資料。

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())
}

此範例成功反序列化 JSON 數據,其中時間欄位為自訂「2006/01/」 02|15:04:05" 格式。

以上是如何在 Go 中自訂 JSON 時間解組以處理非 RFC 3339 格式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn