遍历Golang地图

时间:2014-04-09 15:25:24

标签: go

我初始化了一个名为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 {})

有关如何从此界面获取“关键”值的任何建议?提前谢谢。

2 个答案:

答案 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-simplejsonhttps://github.com/antonholmquist/jason

相关问题