我仍在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
编辑:固定链接
如错误所述,接口变量不支持索引。您将需要使用类型断言来转换为基础类型。
当解码为interface{}变量时,JSON模块将数组表示为[]interface{}切片,将字典表示为map[string]interface{}映射。
interface{}
[]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。
result.Objects[0].ItemId