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

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

Linda Hamilton
發布: 2024-12-26 00:22:09
原創
1001 人瀏覽過

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

Go JSON 中非RFC 3339 時間格式的自訂解組

在Go 中,encoding/json 包嚴格遵守RFC 3339,當反序列化時間值。然而,經常會出現資料採用不同時間格式的情況。如果您想避免繁瑣的轉換,這可能會成為問題。

使用自訂類型

要處理此問題,您可以實作 json.Marshaler 和 json.Unmarshaler 介面在自訂類型上。這允許您定義如何對您的類型進行編組和從 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()
}
登入後複製

In這種類型:

  • UnmarshalJSON 方法從自自定義格式解析時間值("2006/01/02|15:04:05")。
  • MarshalJSON 方法以相同的自訂格式輸出時間值。
  • IsSet 方法檢查時間值是否為設定(非零)。

您可以在JSON 結構中使用CustomTime 類型來處理非RFC 3339 格式的時間值:

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())
}
登入後複製

在此範例中,Args 結構體對Time 欄位使用CustomTime類型。當使用非 RFC 3339 時間格式反序列化 JSON 資料時,CustomTime 類型將正確處理轉換。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板