登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-08 10:33:56 301浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《如何在 Go 中将 JSON 解组为 interface{}?》,介绍一下golang,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我是围棋的新手,现在我遇到了问题。我有一个名为 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"`
}

我有一个 JSON 字符串,例如{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}}.

当我将json.Unmarshal其解码为 Message 变量时,答案是{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}.

那么我可以将 JSON 解码为 Message 结构并根据 Cmd 更改其 Data 的 interface{} 以键入 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")
    }
}

游乐场示例

理论要掌握,实操不能落!以上关于《如何在 Go 中将 JSON 解组为 interface{}?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

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