首頁 >後端開發 >Golang >將 JSON 資料解組到包含嵌入結構的結構時,為什麼會忽略 Num 欄位?

將 JSON 資料解組到包含嵌入結構的結構時,為什麼會忽略 Num 欄位?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-04 21:18:02236瀏覽

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

解組JSON 中的嵌入式結構

嘗試將JSON 資料解組到包含嵌入式結構的結構時,會出現某一些挑戰。考慮以下程式碼:

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

使用 json.Unmarshal(data, &Outer{}) 時,Num 欄位將被忽略。為什麼會發生這種情況?

問題源自於 Inner 嵌入 Outer。當 JSON 函式庫在 Outer 上呼叫 UnmarshalJSON 時,它會無意中在 Inner 上呼叫它。因此,func (i *Inner) UnmarshalJSON(data []byte) 中的 data 參數包含整個 JSON 字串,然後僅為 Inner 處理該字串。

要解決此問題,Inner 需要是明確的外部欄位:

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

這是示範正確方法的範例:

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

以上是將 JSON 資料解組到包含嵌入結構的結構時,為什麼會忽略 Num 欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn