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

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

Susan Sarandon
Susan Sarandonasal
2024-12-22 10:55:11370semak imbas

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

JSON diketepikan dengan masa. Medan Masa: Penyelesaian Tersuai

Pilihan teg yang diabaikan gagal berfungsi dengan masa. Masa kerana ia adalah struct. Ini bermakna nilai "sifar" untuk satu masa. Masa ialah nilai yang sah dengan semua nilai medannya ditetapkan kepada sifar, yang tidak dianggap sebagai "kosong" oleh pengekod json.

Untuk mengatasi cabaran ini, mari kita teroka pendekatan tersuai yang menggunakan penunjuk kepada masa.Masa (*masa.Masa) dan melaksanakan pengekodan dan penyahkodan tersuai.

Berasaskan Penunjuk Penyelesaian

Dengan bertukar kepada penuding, nilai nil ditafsirkan sebagai "kosong" oleh pengekod JSON:

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

Marshaler dan Unmarshaler Tersuai

Jika anda memilih untuk tidak melakukannya gunakan petunjuk, anda boleh melaksanakan Marshaler dan Unmarshaler tersuai antara muka:

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
}

Di sini, kaedah MarshalJSON menetapkan masa bernilai sifar. Kejadian masa kepada nilai sifar Go yang setara, membolehkan pengendalian medan kosong.

Kesimpulan

penyelesaian berasaskan penunjuk adalah mudah dan berkesan. Walau bagaimanapun, jika menggunakan penunjuk tidak boleh dilaksanakan, pendekatan Marshaler/Unmarshaler tersuai menyediakan cara yang fleksibel untuk mengendalikan masa kosong. Nilai masa.

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