如何访问深层嵌套的json键和值

ojo*_*lva 4 go

我正在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...
}
Run Code Online (Sandbox Code Playgroud)

这显然是错误,因为符号不对:

   invalid operation: args[0] (index of type interface {})
Run Code Online (Sandbox Code Playgroud)

我只是找不到一种方法来挖掘地图以获取深层嵌套的键和值.

一旦我可以克服动态值,我想声明这些消息.我如何编写一个类型结构来表示这种复杂的数据结构?

Cod*_*for 8

您可以考虑使用github.com/bitly/go-simplejson软件包

请参阅doc: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)
Run Code Online (Sandbox Code Playgroud)


cth*_*m06 7

您解码的interface{}部分map[string]interface{}将匹配该字段的类型.所以在这种情况下:

args.([]interface{})[0].(map[string]interface{})["time"].(string)
Run Code Online (Sandbox Code Playgroud)

应该回来 "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)
Run Code Online (Sandbox Code Playgroud)

这可能不完美,但应该给你一个想法