首頁 > 後端開發 > Golang > 如何在 Go 的 JSON 編組/解組中有效處理帶有 `time.Time` 欄位的 `omitempty`?

如何在 Go 的 JSON 編組/解組中有效處理帶有 `time.Time` 欄位的 `omitempty`?

Patricia Arquette
發布: 2024-12-26 17:46:10
原創
995 人瀏覽過

How to Effectively Handle `omitempty` with `time.Time` Fields in Go's JSON Marshaling/Unmarshaling?

使用omitempty 自訂time.Time 欄位的JSON 編組/解組

在此場景中,將omitempty 與JSON 中的time .Time 欄位一起使用編組/解組操作不像其他資料型別那麼簡單。預設情況下,time.Time 是一個結構體,且 omitempty 不會將其零值視為空。

解決方案 1:使用指標

要解決此問題,請將time.Time 欄位到指標 (*time.Time)。指標有一個 nil 值,JSON 會將其視為空。

type MyStruct struct {
    Timestamp *time.Time `json:",omitempty"`
    Date      *time.Time `json:",omitempty"`
    Field     string    `json:",omitempty"`
}
登入後複製

透過此修改,帶有 nil 指標的欄位將在 JSON 輸出中省略。

解決方案 2 :自訂編組器/解組器

或者,實作自訂編組器並用於處理 time.Time 欄位的解組器。在封送拆收器中,使用 Time.IsZero() 方法檢查 time.Time 值是否為空。如果為空,則傳回 null JSON 值。在 Unmarshaler 中,將 null JSON 值轉換為 time.Time 的零值。

範例:

type MyStruct struct {
    Timestamp time.Time `json:",omitempty"`
    Date      time.Time `json:",omitempty"`
    Field     string    `json:",omitempty"`
}

func (ms MyStruct) MarshalJSON() ([]byte, error) {
    type Alias MyStruct
    var null NullTime
    if ms.Timestamp.IsZero() {
        null = NullTime(ms.Timestamp)
    }
    return json.Marshal(&struct {
        Alias
        Timestamp NullTime `json:"Timestamp"`
    }{
        Alias:     Alias(ms),
        Timestamp: null,
    })
}

func (ms *MyStruct) UnmarshalJSON(b []byte) error {
    type Alias MyStruct
    aux := &struct {
        *Alias
        Timestamp NullTime `json:"Timestamp"`
    }{
        Alias: (*Alias)(ms),
    }
    if err := json.Unmarshal(b, &aux); err != nil {
        return err
    }
    ms.Timestamp = time.Time(aux.Timestamp)
    return nil
}

// NullTime represents a time.Time that can be null
type NullTime time.Time

func (t NullTime) MarshalJSON() ([]byte, error) {
    if t.IsZero() {
        return []byte("null"), nil
    }
    return []byte(fmt.Sprintf("\"%s\"", time.Time(t).Format(time.RFC3339))), nil
}

func (t *NullTime) UnmarshalJSON(b []byte) error {
    str := string(b)
    if str == "null" {
        *t = NullTime{}
        return nil
    }

    ts, err := time.Parse(time.RFC3339, str[1:len(str)-1])
    if err != nil {
        return err
    }

    *t = NullTime(ts)
    return nil
}
登入後複製

以上是如何在 Go 的 JSON 編組/解組中有效處理帶有 `time.Time` 欄位的 `omitempty`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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