json - 戈朗 : quickly access data of maps within maps

标签 json go

所以我得到了以下 JSON,我想提取“token”下的“$t”值。继续 Go 代码...

{
  "@encoding": "iso-8859-1",
  "@version": "1.0",
  "service": {
    "auth": {
      "expiresString": {
        "$t": "2013-06-12T01:15:28Z"
      },
      "token": {
        "$t": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      },
      "expires": {
        "$t": "1370999728"
      },
      "key": {
        "$t": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
}

我有以下 Go 代码片段,可将 json 解码到接口(interface)中。然后我一直在寻找“token”的“$t”值。这种方法确实有效,但很丑陋。

我的问题:有没有比将每个映射转换为接口(interface)更快的方法来访问该值?我是 Go 的新手,不了解接口(interface)的许多有用功能和 map 。

var f interface{}
jerr := json.Unmarshal(body, &f)
m := f.(map[string]interface{})
ser := m["service"].(map[string]interface{})
a := ser["auth"].(map[string]interface{})
tok := a["token"].(map[string]interface{})
token := tok["$t"]
fmt.Fprintf(w, "Token: %v\n", token)

提前致谢!

最佳答案

如果这是您想要的唯一值,那么使用定义数据路径的匿名 struct 怎么样?

var m = new(struct{Service struct{Auth struct{Token map[string]string}}})

var err = json.Unmarshal([]byte(data), &m)

fmt.Println(m.Service.Auth.Token["$t"], err)

演示: http://play.golang.org/p/ZdKTzM5i57


我们可以使用另一个结构,而不是对最里面的数据使用 map,但是我们需要提供一个字段标记来为名称起别名。

var m = new(struct{Service struct{Auth struct{Token struct{T string `json:"$t"`}}}})

var err = json.Unmarshal([]byte(data), &m)

fmt.Println(m.Service.Auth.Token.T, err)

演示: http://play.golang.org/p/NQTpaUvanx

关于json - 戈朗 : quickly access data of maps within maps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17056044/

相关文章:

json - Flutter:如何显示包含对象列表的已解析json对象中的数据

go - 不显示 revel flash 消息

mongodb - 这些是 mgo 的相同版本/发行版吗?

http - 从在 go 中使用 block 传输的 http 服务器读取和流式传输响应

javascript - 在 PHP 中构建 JSON 并在 <script> 中回显时转义字符

ios - Google Maps API-如何从坐标获取最近的地名,而忽略非特定结果

asp.net-mvc - ASP.net MVC 3-在OnActionExecuting中获取发布的JSON数据

python - 如何在 psycopg2 查询中返回 json?

go - 通过 azure-sdk-for-go 下载 Azure 函数文件

go - 字符串值和字符串文字之间的区别