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
Linda Hamiltonasal
2024-12-18 17:55:10585semak imbas

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"`
}

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
}

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!

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