”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 Go 中使用自定义 UnmarshalJSON 处理嵌入式结构?

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

发布于2024-11-09
浏览:599

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

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

在 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