我还在学习Go,但是当涉及到JSON响应数组时,我遇到了困难.每当我试图访问"Objects"数组的嵌套元素时,Go都会抛出异常(类型interface{}不支持索引)

出了什么问题?我怎样才能避免将来犯这个错误?

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

编辑:固定链接

推荐答案

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

在解码为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遵循已知的格式,更好的解决方案是解码成一个 struct .考虑到示例中的数据,以下方法可能适用:

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.

Go相关问答推荐

gorm如何声明未自动更新的unix时间戳米尔斯字段

GetSecretValue,get identity:get credentials:无法刷新缓存的凭据

如何将GoFr筛选器用于查询参数?

在GO中创建[]字符串类型的变量

golang regex基于关键字拆分字符串

go mod tidy会自动升级go.mod中的go版本吗?

如何在 Chi Router 的受保护路由下提供静态文件(尤其是图像)?

Golang:访问any类型泛型上的字段

转到 bufio.Writer、gzip.Writer 并上传到内存中的 AWS S3

正确的 shell 程序进入 golang alpine docker 容器的入口点?

Go 切片容量增长率

我在 go 中制作的递归函数有什么问题?

仅在工作日运行 cron

如何在没有内存分配的情况下压缩和发布文件

如何在测试中使用自定义标志(使用`testify/suite`)

Go 中 SDL Surface 的 OpenGL 纹理

是否可以使用按位运算在随机 unicode 字符串中找到重复字符?

函数的递归调用以 goroutine 和惯用方式开始,以在所有工作 goroutine 完成时继续调用者

使用 LoadLibraryA(path_to_dll) 加载 DLL 会将文件描述符 0、1 和 2 的继承句柄标志 (HANDLE_FLAG_INHERIT) 从 1 更改为 0

我应该明确地创建一个与Belongs To或Has Many对称的关系吗?