Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengendalikan `omitempty` dengan `time.Time` Go dalam JSON Marshaling?

Bagaimana untuk Mengendalikan `omitempty` dengan `time.Time` Go dalam JSON Marshaling?

Linda Hamilton
Lepaskan: 2024-12-18 17:55:10
asal
587 orang telah melayarinya

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

JSON Pengguguran Medan Masa dengan pengabaian

Dalam usaha untuk menyertakan medan masa secara selektif dalam penyirian JSON, json:",omitempty" tag biasanya digunakan. Walau bagaimanapun, ia mungkin menunjukkan tingkah laku yang tidak dijangka apabila digunakan dengan masa. Medan masa.

Isu teras terletak pada sifat masa. Masa sebagai struktur. Tidak seperti jenis skalar seperti rentetan atau integer, yang mempunyai keadaan "kosong" yang jelas (mis., rentetan kosong), struct mempunyai nilai "sifar" yang mewakili contoh yang dimulakan tetapi kosong. Dalam kes ini, nilai masa sifar. Masa memulakan semua medannya kepada nilai lalainya.

Disebabkan perbezaan ini, json:",omitempty" tidak mengenali masa bernilai sifar. Masa sebagai " kosong" dan akan sentiasa memasukkannya dalam output JSON. Untuk mengatasi had ini, anda boleh menggunakan salah satu daripada pendekatan berikut:

1. Gunakan Jenis Penunjuk:
Dengan menukar medan masa.Masa kepada penuding (*masa.Masa), anda boleh mengambil kesempatan daripada fakta bahawa penunjuk tiada dianggap "kosong" dalam pengendalian JSON. Penyelesaian ini memudahkan kod:

type MyStruct struct {
    Timestamp *time.Time `json:",omitempty"`
    Field     string     `json:",omitempty"`
}
Salin selepas log masuk

2. Laksanakan Custom Marshaler dan Unmarshaler:
Jika menggunakan penuding tidak dapat dilaksanakan, anda boleh melaksanakan kaedah JSON Marshaler dan Unmarshaler tersuai untuk struct anda yang memanfaatkan masa.Time.IsZero() untuk memasukkan atau mengecualikan medan secara bersyarat:

// MarshalJSON implements the custom JSON Marshaler for MyStruct.
func (ms MyStruct) MarshalJSON() ([]byte, error) {
    type Alias MyStruct

    if ms.Timestamp.IsZero() {
        return json.Marshal(struct{ Alias }{ms.Field})
    }

    return json.Marshal(struct{ Alias }{Alias(ms)})
}

// UnmarshalJSON implements the custom JSON Unmarshaler for MyStruct.
func (ms *MyStruct) UnmarshalJSON(b []byte) error {
    type Alias MyStruct

    var as Alias
    if err := json.Unmarshal(b, &as); err != nil {
        return err
    }

    ms.Field = as.Field
    if !as.Timestamp.IsZero() {
        ms.Timestamp = &as.Timestamp
    }

    return nil
}
Salin selepas log masuk

Perhatikan bahawa melaksanakan kaedah Marshaler dan Unmarshaler tersuai memerlukan pemahaman yang lebih mendalam tentang proses pensirilan dan penyahserikatan JSON yang mendasari.

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan `omitempty` dengan `time.Time` Go dalam JSON Marshaling?. 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