我正在用Go编写一个websocket客户端。我正在从服务器接收以下JSON:
{"args":[{"time":"2013-05-21 16:57:17"}],"name":"send:time"}
我正在尝试访问该time参数,但无法掌握如何深入了解接口类型:
time
package main; import "encoding/json" import "log" func main() { msg := `{"args":[{"time":"2013-05-21 16:56:16", "tzs":[{"name":"GMT"}]}],"name":"send:time"}` u := map[string]interface{}{} err := json.Unmarshal([]byte(msg), &u) if err != nil { panic(err) } args := u["args"] log.Println( args[0]["time"] ) // invalid notation... }
显然是错误的,因为这种表示法是不正确的:
invalid operation: args[0] (index of type interface {})
我只是找不到一种方法来挖掘地图以获取深层嵌套的键和值。
一旦可以克服动态值,我便想声明这些消息。我将如何编写类型结构来表示这种复杂的数据结构?
您解码成的interface{}部分map[string]interface{}将与该字段的类型匹配。因此,在这种情况下:
interface{}
map[string]interface{}
args.([]interface{})[0].(map[string]interface{})["time"].(string)
应该回来 "2013-05-21 16:56:16"
"2013-05-21 16:56:16"
但是,如果您知道JSON的结构,则应尝试定义一个与该结构匹配的结构,然后将其解组。例如:
type Time struct { Time time.Time `json:"time"` Timezone []TZStruct `json:"tzs"` // obv. you need to define TZStruct as well Name string `json:"name"` } type TimeResponse struct { Args []Time `json:"args"` } var t TimeResponse json.Unmarshal(msg, &t)
那可能不是完美的,但是应该可以给你这个主意