Bagaimana untuk Mengendalikan Struktur Terbenam dengan UnmarshalJSON Tersuai dalam Go?

Barbara Streisand
Lepaskan: 2024-11-04 14:29:02
asal
205 orang telah melayarinya

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

Pengendalian Ralat: Custom Unmarshal for Embedded Structs

In Go, apabila menyahmarshall data JSON ke dalam struct dengan medan terbenam, seseorang mungkin menghadapi masalah jika struct terbenam mentakrifkannya kaedah UnmarshalJSON sendiri. Ini kerana perpustakaan JSON memanggil UnmarshalJSON struct terbenam dan mengabaikan medan yang ditakrifkan dalam struct yang mengandungi.

Kajian Kes

Pertimbangkan definisi struct berikut:

<code class="go">type Outer struct {
    Inner
    Num int
}

type Inner struct {
    Data string
}

func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}</code>
Salin selepas log masuk

Apabila menyahmarshaling JSON ke Luar menggunakan json.Unmarshal(data, &Outer{}), medan Dalam mencetuskan kaedah UnmarshalJSONnya, menggunakan keseluruhan rentetan JSON. Ini menyebabkan medan Num dalam Luar diabaikan.

Penyelesaian: Medan Eksplisit

Untuk menyelesaikan isu ini, tukarkan Inner struct terbenam kepada medan eksplisit dalam Outer:

<code class="go">type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}</code>
Salin selepas log masuk

Dengan menjadikan Inner medan eksplisit, anda memastikan perpustakaan JSON menyahmarshal data ke dalam medan Outer yang sesuai, termasuk medan Num.

Contoh

<code class="go">import (
    "encoding/json"
    "fmt"
)

type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}

type Inner struct {
    Data string
}

func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}

func main() {
    data := []byte(`{"Data": "Example", "Num": 42}`)
    var outer Outer
    err := json.Unmarshal(data, &outer)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(outer.I.Data, outer.Num) // Output: Example 42
}</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Struktur Terbenam dengan UnmarshalJSON 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