Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Membenamkan Struktur dengan Kaedah `MarshalJSON()` Tersuai secara Idiomatik dalam Go?

Bagaimana untuk Membenamkan Struktur dengan Kaedah `MarshalJSON()` Tersuai secara Idiomatik dalam Go?

Susan Sarandon
Lepaskan: 2024-12-13 18:45:11
asal
532 orang telah melayarinya

How to Embed Structs with Custom `MarshalJSON()` Methods Idiomatically in Go?

Cara Idiomatik untuk Membenamkan Struktur dengan Kaedah Custom MarshalJSON()

Memandangkan struct di bawah, kita boleh dengan mudah menyusun struct Pekerja kepada JSON sebagai dijangka:

type Person struct {
    Name string `json:"name"`
}

type Employee struct {
    *Person
    JobRole string `json:"jobRole"`
}
Salin selepas log masuk

Walau bagaimanapun, apabila struct terbenam mempunyai kaedah MarshalJSON() tersuai, ia memecahkan proses marshalling:

func (p *Person) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        Name string `json:"name"`
    }{
        Name: strings.ToUpper(p.Name),
    })
}
Salin selepas log masuk

Ini kerana struct Person terbenam melaksanakan fungsi MarshalJSON(), yang lebih diutamakan berbanding kaedah MarshalJSON() struct Pekerja sendiri.

Output yang dikehendaki adalah untuk mengekod medan Pekerja secara normal, sambil menunda kepada Kaedah MarshalJSON() Orang untuk mengawal medannya. Walau bagaimanapun, menambah kaedah MarshalJSON() kepada Pekerja memerlukan mengetahui bahawa jenis terbenam melaksanakan MarshalJSON() juga, yang boleh menjadi rapuh.

Untuk menyelesaikan isu ini, kami boleh menggunakan pendekatan yang berbeza:

  1. Buat nama jenis baharu untuk mewakili Nama Orang name:

    type Name string
    Salin selepas log masuk
  2. Laksanakan MarshalJSON() pada Name untuk menyesuaikan pengekodannya:

    func (n Name) MarshalJSON() ([]byte, error) {
     return json.Marshal(strings.ToUpper(string(n)))
    }
    Salin selepas log masuk
  3. Ubah suai struct Person untuk menggunakan Name bukannya rentetan:

    type Person struct {
     Name Name `json:"name"`
    }
    Salin selepas log masuk

Pendekatan ini membolehkan kami menyesuaikan pengekodan nama Orang tanpa memerlukan kaedah MarshalJSON() pada struct Pekerja.

Sebagai alternatif, jika kita ingin melaksanakan ini secara lebih umum, kita perlu melaksanakan MarshalJSON pada jenis luar. Kaedah pada jenis dalam dipromosikan kepada jenis luar, jadi kita boleh memanggil kaedah MarshalJSON jenis dalam, menyahmarshal outputnya ke dalam struktur generik seperti map[rentetan]antara muka{} dan menambah medan kita sendiri. Walau bagaimanapun, ini boleh menyebabkan kesan sampingan menukar susunan medan keluaran akhir.

Atas ialah kandungan terperinci Bagaimana untuk Membenamkan Struktur dengan Kaedah `MarshalJSON()` Tersuai secara Idiomatik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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