解組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中文網其他相關文章!