如何将JSON解组到Go中的接口{}?

如何将JSON解组到Go中的接口{}?,json,go,Json,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 `

我是围棋新手,现在有个问题。我有一个名为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
将其解码为消息变量时,答案是
{Cmd:create Data:map[conf:map[a:1]info:map[b:2]]}

那么,我可以将JSON解码为消息结构,并根据Cmd将其数据接口{}更改为CreateMessage类型吗


我试图将数据直接转换为CreateMessage类型,但编译器告诉我数据是映射[sting]接口{}类型。

为消息的固定部分定义一个结构类型,并使用一个字段捕获消息的可变部分。为每个变量类型定义结构类型,并根据命令对其进行解码

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

为消息的固定部分定义一个结构类型,并使用一个字段捕获消息的可变部分。为每个变量类型定义结构类型,并根据命令对其进行解码

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