我初始化了一个名为data的变量,如下所示:
var data interface{}
然后我将原始json解组为。
err = json.Unmarshal(raw, &data)
我在它上面运行了这两个函数:
fmt.Println(reflect.TypeOf(data))
fmt.Println(data)
然后返回:
map[string]interface {}
map[tasks:[map[payload:map[key:36A6D454-FEEE-46EB-9D64-A85ABEABBCB7] code_name:image_resize]]]
我需要访问“密钥”。我尝试过这些方法以及其他一些方法:
data["tasks"][0]["payload"]["key"]
data[0][0][0][0]
这些都给了我一个类似于这个的错误:
./resize.go:44: invalid operation: data["tasks"] (index of type interface {})
有关如何从此界面获取“关键”值的任何建议?提前谢谢。
答案 0 :(得分:9)
由于您已经了解了架构,因此最好的方法是直接解组为可以使用的结构。
http://play.golang.org/p/aInZp8IZQA
package main
import (
"encoding/json"
"fmt"
)
type msg struct {
Tasks []task `json:"tasks"`
}
type task struct {
CodeName string `json:"code_name"`
Payload payload `json:"payload"`
}
type payload struct {
Key string `json:"key"`
}
func main() {
var data msg
raw := `{ "tasks": [ { "code_name": "image_resize", "payload": { "key": "36A6D454-FEEE-46EB-9D64-A85ABEABBCB7" } } ] }`
err := json.Unmarshal([]byte(raw), &data)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(data.Tasks[0].Payload.Key)
}
如果您坚持使用原始代码进行艰苦的处理,则需要键入断言。我强烈建议尽可能避免这条路线。这不好玩。需要检查每个步骤以确保它与您期望的数据结构相匹配。
http://play.golang.org/p/fI5sqKV19J
if m, ok := data.(map[string]interface{}); ok {
if a, ok := m["tasks"].([]interface{}); ok && len(a) > 0 {
if e, ok := a[0].(map[string]interface{}); ok {
if p, ok := e["payload"].(map[string]interface{}); ok {
if k, ok := p["key"].(string); ok {
fmt.Println("The key is:", k)
}
}
}
}
}
回应Goodwine的问题:你可以通过阅读编码/ json godoc来进一步阅读关于如何编组和解组的内容。我建议从这里开始:
答案 1 :(得分:0)
另一种解决方案是使用第三方软件包,例如https://github.com/Jeffail/gabs
使用gabs
,@ stephen-weinberg上面的例子可以写成:
raw := `{ "tasks": [ { "code_name": "image_resize", "payload": { "key": "36A6D454-FEEE-46EB-9D64-A85ABEABBCB7" } } ] }`
j, _ := gabs.ParseJSON([]byte(raw))
fmt.Println("The key is", j.S("tasks").Index(0).S("payload", "key").Data().(string))
我偶然发现的其他流行的json处理包:https://github.com/bitly/go-simplejson和https://github.com/antonholmquist/jason。