在 Go 中,当将 JSON 数据解组到具有嵌入式字段的结构时,如果嵌入式结构定义了其自己的 UnmarshalJSON 方法。这是因为 JSON 库调用嵌入结构的 UnmarshalJSON 并忽略包含结构中定义的字段。
考虑以下结构定义:
type Outer struct {
Inner
Num int
}
type Inner struct {
Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
i.Data = string(data)
return nil
}
当使用 json.Unmarshal(data, &Outer{}) 将 JSON 解组到 Outer 时,Inner 字段会触发其 UnmarshalJSON 方法,消耗整个 JSON 字符串。这会导致 Outer 中的 Num 字段被忽略。
要解决此问题,请将嵌入的 struct Inner 转换为 Outer 中的显式字段:
type Outer struct {
I Inner // make Inner an explicit field
Num int `json:"Num"`
}
通过将 Inner 设为显式字段,您可以确保 JSON 库将数据解组到 Outer 的相应字段中,包括 Num 字段。
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
}
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3