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

读取和取消编组 API 结果在戈朗

读取和取消编组 API 结果在戈朗

Go
守候你守候我 2022-09-12 17:09:39
在下面的程序中,我从API中提取一些数据。它输出一个相当复杂的数据。当 I 时,结果是类型 。如果我尝试读取结果,它只是一个随机的整数数组。ioutil.ReadAll(resp.Body)[]uint8但是,如果我使用将其转换为字符串,我能够阅读它 但是我想在结构中使用它 并且无法取消编组。string(diskinfo)package mainimport (    "encoding/json"    "fmt"    "io/ioutil"    "net/http"    "net/url"    "reflect")type ApiResults struct {    results []struct {        statement_id int `json.statement_id`        series       []struct {            name string `json.name`            tags struct {                host string `json.host`            }            columns []string      `json.columns`            values  []interface{} `json.values`        }    }}func main() {    my_url := "my_url"    my_qry := fmt.Sprintf("my_query")    resp, err := http.Get(my_url + url.QueryEscape(my_qry))    if err != nil {        fmt.Printf("ERROR:  %v\n", err)    } else {        fmt.Println(reflect.TypeOf(resp))        diskinfo, _ := ioutil.ReadAll(resp.Body)        fmt.Println(reflect.TypeOf((diskinfo)))        fmt.Println(diskinfo)        fmt.Println(string(diskinfo))        diskinfo_string := string(diskinfo)        data := ApiResults{}        json.Unmarshal([]byte(diskinfo_string), &data)        //fmt.Printf("Values = %v\n", data.results.series.values)        //fmt.Printf("Server = %v\n", data.results.series.tags.host)    }}如果我以字符串形式查看数据,我得到这个(格式化):{"results":[  {"statement_id":0,   "series":[    {"name":"disk",     "tags":{"host":"myServer1"},     "columns":["time","disk_size"],     "values":[["2021-07-07T07:53:32.291490387Z",1044]]},    {"name":"disk",     "tags":{"host":"myServer2"},     "columns":["time","disk_size"],     "values":[["2021-07-07T07:53:32.291490387Z",1046]]}  ]}]}我认为我的结构也结构不正确,因为 API 结果包含多个主机的信息。但首先,我怀疑数据是否必须以不同的格式发送到结构。一旦我这样做了,我可能会尝试弄清楚接下来如何从结构中读取。Apireturn
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

已为您提供类型为 的数据。因此,您只需将其作为参数传递即可。ioutil.ReadAllbyte[]json.Unmarshal


import (

    "encoding/json"

    "io/ioutil"

    "net/http"

)



func toStruct(res *http.Response) (*ApiResults, error) {

    body, err := ioutil.ReadAll(res.Body)

    if err != nil {

        return nil, err

    }


    defer res.Body.Close()


    data := ApiResults{}

    if err := json.Unmarshal(body, &data); err != nil {

        return nil, err

    }


    return data, nil 

}

您的结构似乎也存在问题。使用结构标记的正确方法如下。另外,需要导出字段以使 json 标记(由 使用)正常工作 - 从大写字母开始即可。json.Umarshal


type ApiResults struct {

    Results []struct {

        StatementId int `json:"statement_id"`

        Series       []struct {

            Name string `json:"name"`

            Tags struct {

                Host string `json:"host"`

            } `json:"tags"`

            Columns []string      `json:"columns"`

            Values  []interface{} `json:"values"`

        } `json:"series"`

    } `json:"results"`

}


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号