首页 > 后端开发 > Golang > 正文

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

Mary-Kate Olsen
发布: 2024-11-04 21:18:02
原创
178 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!