登录
首页 >  Golang >  Go问答

如何在Go中将JSON解组到interface{}中?

来源:stackoverflow

时间:2024-04-07 10:54:33 448浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《如何在Go中将JSON解组到interface{}中?》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我是 go 的新手,现在遇到了问题。我有一个名为 message 的类型,它是这样的结构:

type message struct {
    cmd string `json:"cmd"`
    data interface{} `json:"data"`
}

我还有一个名为 createmessage 的类型,如下所示:

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

我有一个像 {"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}} 这样的 json 字符串

当我使用 json.unmarshal 将其解码为消息变量时,答案是 {cmd:create data:map[conf:map[a:1] info:map[b:2]]}

那么我可以将 json 解码为 message 结构并更改其 data 的接口{}以根据 cmd 输入 createmessage 吗?

我尝试将 data 直接转换为 createmessage 类型,但编译器告诉我 data 是一个 map[sting]interface{} 类型。


解决方案


使用 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")
    }
}

playground example

今天关于《如何在Go中将JSON解组到interface{}中?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>