如何在 Go 中将 JSON 解组到 interface{} 中?
How to unmarshal JSON into interface{} in Go?
我是 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"`
}
我有一个 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 结构并将其 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")
}
}
我是 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"`
}
我有一个 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 结构并将其 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")
}
}