为了账号安全,请及时绑定邮箱和手机立即绑定

Go Lang 帮助 - 访问接口的数组/切片

Go Lang 帮助 - 访问接口的数组/切片

Go
慕运维8079593 2022-01-17 18:02:34
我正在尝试使用嵌套数据解码 GO 中的动态/随机 JSON 响应    body, _ := ioutil.ReadAll(response.Body)    resp := make(map[string]interface{})    err = json.Unmarshal(body, &resp)    fmt.Printf("BODY: %T<\n", body)    fmt.Printf("BODY: %s<\n", body)    fmt.Printf("RESP: %s<\n", resp)    fmt.Printf("RESP: %T<\n", resp)    fmt.Printf("RESP[results]: %T<\n", resp["results"])    fmt.Printf("RESP[results]: %s<\n", resp["results"])body 是来自 HTTP 服务器的 JSON 结果,我将其解组,结果看起来是一个字节片。正文:[]uint8BODY: {"results":[{"code":500.0,"errors":["配置文件 'c2-web-2.conf' 已经存在。"],"status":"无法创建对象。" }]}所以我将它解组为 resp 并且按预期工作。RESP:地图[字符串]接口{}RESP: map[results:[map[code:%!s(float64=500) 错误:[配置文件'c2-web-2.conf'已经存在。]状态:无法创建对象。]]]]<我可以使用关键结果访问地图。RESP[结果]:[]接口{}RESP[results]:[map[code:%!s(float64=500) 错误:[配置文件 'conf.d/hosts/c2-web-2.conf' 已经存在。] 状态:无法创建对象。 ]]<现在我想访问它的“代码”、“错误”和“状态”,它们位于 resp[“results”] 这看起来像一个数组或切片,我尝试过索引它,但在编译时出现错误./create_host.go:62: 无效操作:resp["results"][0] (type interface {} 不支持索引)我做了很多谷歌搜索,尝试在 resp["results"] 等中解组数据,但几天后我没有取得太大进展。我应该如何访问似乎是数组成员的地图?无法保证数据结构,因此我无法创建结构并将其解组。谢谢
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

一位同事提供了下面的代码片段,可以访问我正在寻找的地图条目。


    respBody, _ := ioutil.ReadAll(response.Body)


    var rsp interface{}

    if err := json.Unmarshal(respBody, &rsp); err != nil {

            log.Fatal(err)

    }

    resultMap := rsp.(map[string]interface{})["results"].([]interface{})[0].(map[string]interface{})

    fmt.Printf("test: %s<\n", resultMap["errors"] )

测试:[配置文件'c2-web-2.conf'已经存在。]<


查看完整回答
反对 回复 2022-01-17
?
米脂

TA贡献1836条经验 获得超3个赞

我相信你需要做一个类型断言。你有一个interface{},但你需要某种切片来索引。试试resp["results"].([]interface{})[0]?(对不起,我自己没有机会测试这个。)


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信