首頁 >後端開發 >Golang >如何在 Go JSON 封送處理中處理帶有 `time.Time` 欄位的 `omitempty`?

如何在 Go JSON 封送處理中處理帶有 `time.Time` 欄位的 `omitempty`?

Susan Sarandon
Susan Sarandon原創
2024-12-22 10:55:11370瀏覽

How to Handle `omitempty` with `time.Time` Fields in Go JSON Marshaling?

帶有 time.Time 欄位的 JSON omitempty:自訂解決方案

omitempty 標籤選項無法與 time.Time 一起使用,因為它是一個結構體。這意味著時間的“零”值。 Time 是一個有效值,其所有欄位值都設為零,json 編碼器不會將其視為「空」。

要克服這項挑戰,讓我們探索一種自訂方法,該方法使用指向 time.Time (*time.Time) 的指標並實作自訂編碼和解碼。

基於指針解決方案

切換到指針,nil 值會被JSON 編碼器解釋為「空」:

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

自訂編組器和解組器

如果您不想這樣做使用指針,可以實現自訂的Marshaler 和Unmarshaler介面:

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

func (ms MyStruct) MarshalJSON() ([]byte, error) {
    type Alias MyStruct
    if ms.Timestamp.IsZero() {
        ms.Timestamp = time.Time{}
    }
    if ms.Date.IsZero() {
        ms.Date = time.Time{}
    }
    return json.Marshal(Alias(ms))
}

func (ms *MyStruct) UnmarshalJSON(data []byte) error {
    type Alias MyStruct
    aux := &Alias{}
    if err := json.Unmarshal(data, aux); err != nil {
        return err
    }
    *ms = MyStruct(aux)
    return nil
}

這裡, MarshalJSON 方法將零值 time.Time 實例設定為等效的 Go 零值,從而啟用空白欄位處理。

結論

基於指標的解決方案簡單有效。但是,如果使用指標不可行,則自訂 Marshaler/Unmarshaler 方法提供了一種靈活的方法來處理空 time.Time 值。

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

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