亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

讀取和取消編組 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 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號