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

解组后访问嵌套JSON数组的Golang问题,json,go,Json,Go,我仍在学习Go,但在JSON响应数组方面遇到了困难。每当我试图访问“objects”数组的嵌套元素时,Go抛出(类型接口{}不支持索引) 出了什么问题?我如何避免在将来犯这个错误 package main import ( "encoding/json" "fmt" ) func main() { payload := []byte(`{"query": "QEACOR139GID","count": 1,"objects":

我仍在学习Go,但在JSON响应数组方面遇到了困难。每当我试图访问“objects”数组的嵌套元素时,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"])    

}


编辑:固定链接正如错误所说,接口变量不支持索引。您将需要使用转换为基础类型

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

在不进行错误检查的情况下,您可以使用以下内容深入了解此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"`
}

如果您解码为这种类型,您可以作为
result.Objects[0]访问项目ID。对于像我这样可能寻找类似解决方案的人,
https://github.com/Jeffail/gabs
提供了更好的解决方案

我在这里提供了一个例子

package main

import (
    "encoding/json"
    "fmt"

    "github.com/Jeffail/gabs"
)

func main() {
    payload := []byte(`{
        "query": "QEACOR139GID",
        "count": 1,
        "objects": [{
            "ITEM_ID": "QEACOR139GID",
            "PROD_CLASS_ID": "BMXCPGRIPS",
            "AVAILABLE": 19, 
            "Messages": [ {
                    "first": {
                        "text":  "sth, 1st"
                    }
                },
                {
                        "second": {
                        "text": "sth, 2nd"
                    }
              }
            ]
        }]
    }`)

    fmt.Println("Use gabs:")
    jsonParsed, _ := gabs.ParseJSON(payload)
    data := jsonParsed.Path("objects").Data()
    fmt.Println("  Fetch Data: ")
    fmt.Println("    ", data)
    children, _ := jsonParsed.Path("objects").Children()
    fmt.Println("  Children Array from \"Objects\": ")
    for key, child := range children {
        fmt.Println("    ", key, ": ", child)
        children2, _ := child.Path("Messages").Children()
        fmt.Println("    Children Array from \"Messages\": ")
        for key2, child2 := range children2 {
            fmt.Println("      ", key2, ": ", child2)
        }
    }
}

你的例子对我有用…@fabrizioM,play.golang.org上的例子与question.Fixed中列出的代码不同。很抱歉,我只是打了同样的答案。延迟是因为我必须携带食品:)为了将来的参考,这里有一个工作游戏示例:感谢您对使用嵌套JSON结构的深入了解!嗨,James Henstridge,类型示例结构{text[]string}类型结果结构{Query string Count int Objects[]struct{ItemId string}