Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membenamkan Struct secara Idiomatik dengan `MarshalJSON()` Tersuai dalam Go?
Cabaran timbul apabila struct terbenam mentakrifkan kaedah MarshalJSON() tersuai, menyebabkan tingkah laku siri JSON yang tidak dijangka apabila cuba untuk mengawal kandungan struct.
Pertimbangkan definisi struct berikut:
type Person struct { Name string `json:"name"` } type Employee struct { *Person JobRole string `json:"jobRole"` }
Marshaling struct Pekerja seperti yang dijangkakan adalah mudah:
p := Person{"Bob"} e := Employee{&p, "Sales"} output, _ := json.Marshal(e) fmt.Printf("%s\n", string(output))
Output:
{"name":"Bob","jobRole":"Sales"}
Walau bagaimanapun, mentakrifkan kaedah MarshalJSON() tersuai untuk struct terbenam, seperti yang ditunjukkan di bawah, mengganggu siri yang dimaksudkan:
func (p *Person) MarshalJSON() ([]byte, error) { return json.Marshal(struct{ Name string `json:"name"` }{ Name: strings.ToUpper(p.Name), }) }
Sekarang, marshaling Pekerja menghasilkan output dengan medan nama ditukar kepada huruf besar tetapi terlepas medan tugasPeranan:
{"name":"BOB"}
Untuk mengekalkan tingkah laku bersiri yang diingini, elakkan mentakrifkan kaedah MarshalJSON() pada struct terbenam (Person). Sebaliknya, cipta jenis berasingan yang merangkum logik marshalling tersuai dan benamkan jenis itu:
type Name string func (n Name) MarshalJSON() ([]byte, error) { return json.Marshal(struct{ Name string `json:"name"` }{ Name: strings.ToUpper(string(n)), }) } type Person struct { Name Name `json:"name"` }
Pendekatan ini mengasingkan penyesuaian marshalling kepada jenis khusus, menghalang kesan sampingan yang tidak dijangka apabila membenamkan struct Person di tempat lain.
Contoh: https://play.golang.org/p/u96T4C6PaY
Atas ialah kandungan terperinci Bagaimana untuk Membenamkan Struct secara Idiomatik dengan `MarshalJSON()` Tersuai dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!