我初始化了一个名为data的变量,如下所示:
var data interface{}
Run Code Online (Sandbox Code Playgroud)
然后我把原始的json解组成了.
err = json.Unmarshal(raw, &data)
Run Code Online (Sandbox Code Playgroud)
我在它上面运行了这两个函数:
fmt.Println(reflect.TypeOf(data))
fmt.Println(data)
Run Code Online (Sandbox Code Playgroud)
那些归还:
map[string]interface {}
map[tasks:[map[payload:map[key:36A6D454-FEEE-46EB-9D64-A85ABEABBCB7] code_name:image_resize]]]
Run Code Online (Sandbox Code Playgroud)
我需要访问"密钥".我尝试了这些方法以及其他一些方法:
data["tasks"][0]["payload"]["key"]
data[0][0][0][0]
Run Code Online (Sandbox Code Playgroud)
这些都给了我一个类似于这个的错误:
./resize.go:44: invalid operation: data["tasks"] (index of type interface {})
Run Code Online (Sandbox Code Playgroud)
关于如何从这个界面中获取"关键"值的任何建议?提前致谢.
由于您已经了解了模式,因此最好的方法是直接解组为可以使用的结构.
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)
}
Run Code Online (Sandbox Code Playgroud)
如果您坚持使用原始代码进行艰难的操作,则需要键入断言.我强烈建议尽可能避免这条路线.这不好玩.需要检查每个步骤以确保它与您期望的数据结构相匹配.
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)
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
回应Goodwine的问题:你可以通过阅读编码/ json godoc来进一步阅读如何编组和解组.我建议从这里开始: