Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membenamkan Struktur dengan Kaedah `MarshalJSON()` Tersuai secara Idiomatik dalam 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"` }
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), }) }
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:
Buat nama jenis baharu untuk mewakili Nama Orang name:
type Name string
Laksanakan MarshalJSON() pada Name untuk menyesuaikan pengekodannya:
func (n Name) MarshalJSON() ([]byte, error) { return json.Marshal(strings.ToUpper(string(n))) }
Ubah suai struct Person untuk menggunakan Name bukannya rentetan:
type Person struct { Name Name `json:"name"` }
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!