解组 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中文网其他相关文章!