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{}) 將JSON 物件解組到Outer 實例中只會填入Inner 字段,而Num 字段保持不變。這可以歸因於 JSON 解組嵌入字段的方式。
要解決此問題,建議將嵌入欄位設為父結構中的明確欄位。此修改允許 JSON 解組器直接存取和解組該欄位。以下是修正後的結構體定義:
<code class="go">Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
在此更新版本中,內部欄位成為名為 I 的明確欄位。此外,Num 欄位使用 json:"Num" 進行標記,以確保 JSON 鍵「Num」在解組期間會對應到此欄位。
透過採用此方法,當 JSON 物件解組到 Outer 實例時,I 和 Num 欄位都會被正確填入。
以上是為什麼嵌入式結構的 JSON 解組會導致意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!