Rumah > pembangunan bahagian belakang > Golang > Mengapa medan Num diabaikan apabila menyahmarshaling data JSON ke dalam struct yang mengandungi struct terbenam?

Mengapa medan Num diabaikan apabila menyahmarshaling data JSON ke dalam struct yang mengandungi struct terbenam?

Mary-Kate Olsen
Lepaskan: 2024-11-04 21:18:02
asal
230 orang telah melayarinya

Why is the Num field ignored when unmarshalling JSON data into a struct containing an embedded struct?

Menyahmarshalkan Struktur Terbenam dalam JSON

Apabila cuba menyahmarshal data JSON ke dalam struct yang mengandungi struct terbenam, cabaran tertentu timbul. Pertimbangkan kod 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

Setelah menggunakan json.Unmarshal(data, &Outer{}), medan Num diabaikan. Mengapa ini berlaku?

Isu ini berpunca daripada pembenaman Dalaman dalam Luaran. Apabila pustaka JSON memanggil UnmarshalJSON pada Outer, ia secara tidak sengaja memanggilnya pada Inner sebaliknya. Akibatnya, hujah data dalam func (i *Inner) UnmarshalJSON(data []bait) mengandungi keseluruhan rentetan JSON, yang kemudiannya diproses hanya untuk Inner.

Untuk menyelesaikan isu ini, Inner perlu bersifat eksplisit medan di Luar:

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

Berikut ialah contoh yang menunjukkan pendekatan yang betul:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Outer struct {
    I Inner `json:"I"`
    Num int `json:"Num"`
}

type Inner struct {
    Data string `json:"data"`
}

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

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

Atas ialah kandungan terperinci Mengapa medan Num diabaikan apabila menyahmarshaling data JSON ke dalam struct yang mengandungi struct terbenam?. 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