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

在下面的程序中,我从API中提取一些数据。


它输出一个相当复杂的数据。当 I 时,结果是类型 。如果我尝试读取结果,它只是一个随机的整数数组。ioutil.ReadAll(resp.Body)[]uint8


但是,如果我使用将其转换为字符串,我能够阅读它 但是我想在结构中使用它 并且无法取消编组。string(diskinfo)


package main


import (

    "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


守候你守候我
浏览 99回答 1
1回答

烙印99

已为您提供类型为 的数据。因此,您只需将其作为参数传递即可。ioutil.ReadAllbyte[]json.Unmarshalimport (    "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.Umarshaltype 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"`}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go