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