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

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

Patricia Arquette
Lepaskan: 2024-12-06 13:18:11
asal
323 orang telah melayarinya

How to Idiomatically Embed a Struct with a Custom `MarshalJSON()` in Go?

Kaedah Idiomatik untuk Membenamkan Struct dengan Custom MarshalJSON()

Cabaran timbul apabila struct terbenam mentakrifkan kaedah MarshalJSON() tersuai, menyebabkan tingkah laku siri JSON yang tidak dijangka apabila cuba untuk mengawal kandungan struct.

Latar Belakang

Pertimbangkan definisi struct berikut:

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

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

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

Output:

{"name":"Bob","jobRole":"Sales"}
Salin selepas log masuk

The Masalah

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

Sekarang, marshaling Pekerja menghasilkan output dengan medan nama ditukar kepada huruf besar tetapi terlepas medan tugasPeranan:

{"name":"BOB"}
Salin selepas log masuk

Idiomatik Penyelesaian

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

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!

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