首页  >  文章  >  后端开发  >  如何在 Go 中使用自定义 UnmarshalJSON 处理嵌入式结构?

如何在 Go 中使用自定义 UnmarshalJSON 处理嵌入式结构?

Barbara Streisand
Barbara Streisand原创
2024-11-04 14:29:02163浏览

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

错误处理:嵌入式结构的自定义解组

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

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