首页 >后端开发 >Golang >将 JSON 数据解组到包含嵌入结构的结构时,为什么会忽略 Num 字段?

将 JSON 数据解组到包含嵌入结构的结构时,为什么会忽略 Num 字段?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-04 21:18:02229浏览

Why is the Num field ignored when unmarshalling JSON data into a struct containing an embedded struct?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn