首页 > 后端开发 > Golang > 如何根据动态字段值将 JSON 解组到 Go 接口?

如何根据动态字段值将 JSON 解组到 Go 接口?

Barbara Streisand
发布: 2024-12-21 20:01:11
原创
590 人浏览过

How to Unmarshal JSON into Go Interfaces Based on a Dynamic Field Value?

将 JSON 解组到 Go 中的接口

考虑这样的场景,您有一个 JSON 字符串,它具有取决于特定字段的不同数据结构,例如作为“cmd”字段。您希望将此 JSON 解组到包含一个具有 interface{} 类型的字段的 Go 结构体中,并根据“cmd”值使其适应不同的数据结构。

解决方案

要实现此目的,请定义一个具有固定字段的基本结构和一个 json.RawMessage 字段来保存变体数据。然后,为每个变体创建特定的结构类型,并根据命令解组它们。

例如:

type Message struct {
  Cmd string `json:"cmd"`
  Data      json.RawMessage
}  

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}  

func main() {
    var m Message
    if err := json.Unmarshal(data, &m); err != nil {
        log.Fatal(err)
    }
    switch m.Cmd {
    case "create":
        var cm CreateMessage
        if err := json.Unmarshal([]byte(m.Data), &cm); err != nil {
            log.Fatal(err)
        }
        fmt.Println(m.Cmd, cm.Conf, cm.Info)
    default:
        log.Fatal("bad command")
    }
}
登录后复制

在此示例中,Message 结构代表整体消息结构,包含“cmd”字段和 json.RawMessage 字段用于保存变体数据。 CreateMessage 是表示“创建”命令变体的特定结构类型。

代码将初始 JSON 字符串解组为 Message 变量,然后使用“cmd”字段确定要解组和打印的特定变体。

以上是如何根据动态字段值将 JSON 解组到 Go 接口?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板