所以我有以下一点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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下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)
Run Code Online (Sandbox Code Playgroud)
提前致谢!
小智 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)
Run Code Online (Sandbox Code Playgroud)
演示: 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)
Run Code Online (Sandbox Code Playgroud)
演示: http : //play.golang.org/p/NQTpaUvanx
或者您可以使用objects.Map我们的炖菜包,它为您提供地图的点访问器:
objects.Map(data).Get("service.auth.token")
Run Code Online (Sandbox Code Playgroud)
见http://godoc.org/github.com/stretchr/stew/objects