Rumah >pembangunan bahagian belakang >Golang >Bagaimana Mengendalikan `omitempty` dengan Medan `time.Time` dengan Berkesan dalam JSON Marshaling/Unmarshaling Go?

Bagaimana Mengendalikan `omitempty` dengan Medan `time.Time` dengan Berkesan dalam JSON Marshaling/Unmarshaling Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-26 17:46:101042semak imbas

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

Menyesuaikan JSON Marshaling/Unmarshaling untuk masa. Medan Masa dengan omitempty

Dalam senario ini, menggunakan omitempty dengan masa. Medan masa dalam JSON operasi marshaling/unmarshaling tidak semudah dengan jenis data lain. Secara lalai, time.Time ialah struct, dan omitempty tidak menganggap nilai sifarnya sebagai kosong.

Penyelesaian 1: Menggunakan Penunjuk

Untuk menyelesaikannya, tukar masa.Medan masa kepada penunjuk (*masa.Masa). Penunjuk mempunyai nilai nil, yang dianggap sebagai kosong oleh JSON.

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

Dengan pengubahsuaian ini, medan dengan penunjuk nil akan ditinggalkan dalam output JSON.

Penyelesaian 2 : Marshaler/Unmarshaler Tersuai

Sebagai alternatif, laksanakan Marshaler tersuai dan Unmarshaler untuk mengendalikan masa. Medan masa. Dalam Marshaler, semak sama ada nilai masa. Masa kosong menggunakan kaedah Time.IsZero(). Jika kosong, kembalikan nilai JSON nol. Dalam Unmarshaler, tukar nilai JSON nol kepada nilai masa sifar. Masa.

Contoh:

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
}

Atas ialah kandungan terperinci Bagaimana Mengendalikan `omitempty` dengan Medan `time.Time` dengan Berkesan dalam JSON Marshaling/Unmarshaling Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn