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
Lepaskan: 2024-12-22 10:55:11
asal
368 orang telah melayarinya

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

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

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!

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