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
Lepaskan: 2024-12-26 17:46:10
asal
987 orang telah melayarinya

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"`
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan