【问题标题】:how to access deeply nested json keys and values如何访问深度嵌套的 json 键和值
【发布时间】:2013-05-21 15:42:38
【问题描述】:

我正在用 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 {})

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

一旦我能够克服抓取动态值的问题,我想声明这些消息。如何编写类型结构来表示如此复杂的数据结构?

【问题讨论】:

  • 返回的 JSON 是否总是有相同的字段?
  • 是的,基本一样。
  • 那么你真的应该使用@cthom06 建议的关于定义与数据匹配的结构。从长远来看,这会让事情变得更容易,因为您会知道每个字段的类型。

标签: go


【解决方案1】:

您不妨考虑一下包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)

【讨论】:

  • 哇,真不错。只是希望我也能像使用 YAML 一样简单,尽管 Gypsy 看起来很有希望。
【解决方案2】:

您解码成的map[string]interface{}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)

这可能并不完美,但应该给你的想法

【讨论】:

  • 成功了,谢谢。但是我怎么把它变成一个类型结构,然后访问数据呢?
  • 这个结构很棒!我只是不明白 json:"key" 字符串如何适合 Go 类型结构的语法,尽管我知道它告诉 json.Unmarshall() func 适合每个键值对的位置。
  • @ojosilva 老实说,我认为这有点骇人听闻。结构字段可以用字符串“标记”,可以通过反射访问。 json 包检查这些标签的 json:options
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2019-03-04
  • 2017-08-15
相关资源
最近更新 更多