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
Patricia Arquetteasal
2024-12-06 13:18:11281semak imbas

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"`
}

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"}

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),
    })
}

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

{"name":"BOB"}

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"`
}

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!

Kenyataan:
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