在Go 中,將JSON 資料解組到具有嵌入式欄位的結構時,如果嵌入式結構定義了其結構,則可能會遇到問題自己的UnmarshalJSON 方法。這是因為 JSON 函式庫呼叫嵌入結構的 UnmarshalJSON 並忽略包含結構中定義的欄位。
考慮以下結構定義:
<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 欄位會觸發其UnmarshalJSON 方法,消耗整個JSON 字串。這會導致 Outer 中的 Num 欄位被忽略。
要解決此問題,請將嵌入的struct Inner 轉換為Outer 中的明確欄位:
<code class="go">type Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
透過將Inner設為明確字段,您可以確保JSON 庫將資料解組到Outer 的適當字段中,包括Num 字段。
<code class="go">import ( "encoding/json" "fmt" ) type Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` } type Inner struct { Data string } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil } func main() { data := []byte(`{"Data": "Example", "Num": 42}`) var outer Outer err := json.Unmarshal(data, &outer) if err != nil { fmt.Println(err) } fmt.Println(outer.I.Data, outer.Num) // Output: Example 42 }</code>
以上是如何在 Go 中使用自訂 UnmarshalJSON 處理嵌入式結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!