Go Lang帮助 - 访问阵列/切片接口

时间:2016-06-13 00:57:29

标签: json dictionary go interface

我尝试使用嵌套数据解析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结果,我解组它,结果看起来是一个字节的片段。

BODY:[] uint8

BODY:{&#34;结果&#34;:[{&#34;代码&#34;:500.0,&#34;错误&#34;:[&#34;配置文件&#39; c2-网络2.conf&#39;已存在。&#34;],&#34;状态&#34;:&#34;无法创建对象。&#34;}]}

因此我将其解组为resp,并按预期工作。

RESP:map [string] interface {}

RESP:map [结果:[map [code:%!s(float64 = 500)错误:[配置文件&#39; c2-web-2.conf&#39;已存在。] status:无法创建对象。]]]&lt;

我可以使用关键结果访问地图。

RESP [结果]:[] interface {}

RESP [结果]:[map [code:%!s(float64 = 500)错误:[配置文件&#39; conf.d / hosts / c2-web-2.conf&#39;已存在。] status:无法创建对象。]]&lt;

现在我想要访问它&#34;代码&#34;,&#34;错误&#34;和&#34;状态&#34;这是在resp [&#34;结果&#34;]这看起来像一个数组或切片,我尝试索引它但我在编译时得到错误

./ create_host.go:62:无效操作:resp [&#34;结果&#34;] [0](类型接口{}不支持索引)

我已经完成了大量的Google搜索,尝试在resp [&#34;结果&#34;]等内部解组数据,但几天后我没有取得多大进展。

我应该如何访问似乎是数组成员的地图?数据结构无法保证,因此我无法创建结构并解组。

由于

2 个答案:

答案 0 :(得分:1)

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

    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'已经存在。]&lt;

答案 1 :(得分:0)

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