我有一个 Web 套接字连接,它在 JSON 对象中发送不同类型的消息,并且我想将内容解组到一些已知的结构中。
为此,我认为我应该执行以下操作:
步骤 1) 将 JSON 解组为通用映射[字符串]接口{}
步骤 2) 找到我要找的钥匙
步骤 3)尝试将值转换为我的类型之一(失败)
第 3 步备用)json 编组该值并将其解组到我已知的结构
如果我尝试使用myStruct, ok := value.(myType)
它会失败,但如果我 json.marshal(value) 然后 json.unmarshal 到 myStruct,它就可以正常工作。我应该这样做吗?去 json-> map[string]interface{} -> json -> myStruct 对我来说似乎是多余的。
示例代码:
https://play.golang.org/p/to_0Id_ja9 https://play.golang.org/p/to_0Id_ja9
package main
import (
"encoding/json"
"fmt"
)
type Ping struct {
Ping string `json:"ping"`
}
type Ack struct {
Messages []Message `json:"messages"`
}
type Message string
func main() {
testJSON := []byte(`{"ack":{"messages":["Hi there","Hi again"]}}`)
var myAck = Ack{}
var myMap map[string]interface{}
err := json.Unmarshal(testJSON, &myMap)
if err != nil {
fmt.Println("error unmarshalling: ", err)
}
for k, v := range myMap {
fmt.Printf("key: %s, value: %s \n", k, v)
switch k {
case "ping":
fmt.Println(k, " is a ping", v)
case "ack":
fmt.Println(k, " is an ack containing a message list")
ackjson, err := json.Marshal(v)
if err != nil {
fmt.Println("marshal error: ", err)
}
err = json.Unmarshal(ackjson, &myAck)
if err != nil {
fmt.Println("unmarshal error", err)
} else {
fmt.Println("New ack object: ", myAck)
}
default:
fmt.Printf("%s is of a type (%T) I don't know how to handle", k, v)
}
}
}