我正在Go中编写一个websocket客户端。我从服务器收到以下JSON:
{"args":[{"time":"2013-05-21 16:57:17"}],"name":"send: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 {})
我无法找到一种方法来挖掘地图以获取深层嵌套的键和值。
一旦我可以克服动态值,我想声明这些消息。我如何编写一个类型结构来表示这种复杂的数据结构?
答案 0 :(得分:8)
您可能需要考虑包github.com/bitly/go-simplejson
请参阅文档:http://godoc.org/github.com/bitly/go-simplejson
示例:
time, err := json.Get("args").GetIndex(0).String("time")
if err != nil {
panic(err)
}
log.Println(time)
答案 1 :(得分:7)
您解码的interface{}
部分map[string]interface{}
部分将与该字段的类型相匹配。所以在这种情况下:
args.([]interface{})[0].(map[string]interface{})["time"].(string)
应该返回"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)
这可能不完美,但应该给你一个想法