Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah JSON Menyahmarshaling Struktur Terbenam Membawa kepada Gelagat Tidak Dijangka?

Mengapakah JSON Menyahmarshaling Struktur Terbenam Membawa kepada Gelagat Tidak Dijangka?

Linda Hamilton
Linda Hamiltonasal
2024-11-07 03:12:02686semak imbas

Why does JSON Unmarshaling of Embedded Structs Lead to Unexpected Behavior?

Penerokaan struktur terbenam JSON Unmarshal

Apabila cuba menyahmarshal objek JSON ke dalam struct dengan medan terbenam, tingkah laku yang tidak dijangka boleh timbul. Untuk menggambarkan ini, pertimbangkan takrifan 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>

Menyahmarshal objek JSON ke dalam contoh Luar menggunakan json.Unmarshal(data, &Outer{}) menyebabkan hanya medan Dalaman diisi, manakala Medan num kekal tidak disentuh. Ini boleh dikaitkan dengan cara JSON menyahmarshal medan terbenam.

Untuk menyelesaikan isu ini, adalah disyorkan untuk menjadikan medan terbenam sebagai medan eksplisit dalam struct induk. Pengubahsuaian ini membolehkan pembongkar JSON mengakses dan menyahmarshal medan secara terus. Berikut ialah definisi struct yang diperbetulkan:

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

Dalam versi yang dikemas kini ini, medan Inner dijadikan medan eksplisit bernama I. Selain itu, medan Num ditag dengan json:"Num" untuk memastikan kekunci JSON "Num" memetakan ke medan ini semasa unmarshalling.

Dengan menggunakan pendekatan ini, kedua-dua medan I dan Num akan betul diisi apabila menyahmarshall objek JSON ke dalam tika Outer.

Atas ialah kandungan terperinci Mengapakah JSON Menyahmarshaling Struktur Terbenam Membawa kepada Gelagat Tidak Dijangka?. 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