一尘不染

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

go

我仍在Go的学习过程中,但是在涉及JSON响应数组时遇到了麻烦。每当我尝试访问“对象”数组的嵌套元素时,Go都会抛出异常(类型接口{}不支持索引)

出了什么问题?将来如何避免犯此错误?

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

编辑:固定链接


阅读 228

收藏
2020-07-02

共1个答案

一尘不染

如错误所述,接口变量不支持索引。您将需要使用类型断言来转换为基础类型。

当解码为interface{}变量时,JSON模块将数组表示为[]interface{}切片,将字典表示为map[string]interface{}映射。

如果没有错误检查,您可以使用类似以下内容的内容来深入研究此JSON:

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

如果类型不匹配,这些类型断言将惊慌。您可以使用两次返回表格,可以检查此错误。例如:

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

但是,如果JSON遵循已知格式,则更好的解决方案是将其解码为结构。给定示例中的数据,可以执行以下操作:

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"`
}

如果您解码为这种类型,则可以使用来访问商品ID result.Objects[0].ItemId

2020-07-02