golang:快速访问地图中的地图数据

时间:2013-06-12 00:43:44

标签: json go

所以我得到了下面的JSON,我想在“令牌”下取出“$ 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解组为接口。然后我向下工作到“令牌”的“$ t”值。这种方法确实有效,但很难看。

我的问题:有没有比通过将每个地图转换为界面更快的方式来访问该值?我是Go的新手,并不知道接口的许多有用功能和地图。

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)

提前致谢!

2 个答案:

答案 0 :(得分:11)

如果这是您想要的唯一值,那么如何使用定义数据路径的匿名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)

DEMO: 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)

DEMO: http://play.golang.org/p/NQTpaUvanx

答案 1 :(得分:6)

或者您可以使用我们的stew包中的objects.Map,它为您提供地图的点访问器:

objects.Map(data).Get("service.auth.token")

请参阅http://godoc.org/github.com/stretchr/stew/objects