doutangshuan6473 2014-06-24 03:32
浏览 87
已采纳

解组后访问嵌套JSON数组的Golang问题

I'm still in the learning process of Go but am hitting a wall when it comes to JSON response arrays. Whenever I try to access a nested element of the "objects" array, Go throws (type interface {} does not support indexing)

What is going wrong and how can I avoid making this mistake in the future?

package main    

import (
        "encoding/json"
        "fmt"
)    

func main() {
        payload := []byte(`{"query": "QEACOR139GID","count": 1,"objects": [{"ITEM_ID": "QEACOR139GID","PROD_CLASS_ID": "BMXCPGRIPS","AVAILABLE": 19}]}`)
        var result map[string]interface{}
        if err := json.Unmarshal(payload, &result); err != nil {
            panic(err)
        }        

        fmt.Println(result["objects"]["ITEM_ID"])    

}

http://play.golang.org/p/duW-meEABJ

edit: Fixed link

  • 写回答

2条回答 默认 最新

  • dongxi6897 2014-06-24 03:46
    关注

    As the error says, interface variables do not support indexing. You will need to use a type assertion to convert to the underlying type.

    When decoding into an interface{} variable, the JSON module represents arrays as []interface{} slices and dictionaries as map[string]interface{} maps.

    Without error checking, you could dig down into this JSON with something like:

    objects := result["objects"].([]interface{})
    first := objects[0].(map[string]interface{})
    fmt.Println(first["ITEM_ID"])
    

    These type assertions will panic if the types do not match. You can use the two-return form, you can check for this error. For example:

    objects, ok := result["objects"].([]interface{})
    if !ok {
        // Handle error here
    }
    

    If the JSON follows a known format though, a better solution would be to decode into a structure. Given the data in your example, the following might do:

    type Result struct {
        Query   string `json:"query"`
        Count   int    `json:"count"`
        Objects []struct {
            ItemId      string `json:"ITEM_ID"`
            ProdClassId string `json:"PROD_CLASS_ID"`
            Available   int    `json:"AVAILABLE"`
        } `json:"objects"`
    }
    

    If you decode into this type, you can access the item ID as result.Objects[0].ItemId.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题