为此 JSON 创建结构时遇到问题

我对golang非常非常陌生(使用这个项目作为更好地学习语言的一种方式)。我有一个想要从中提取数据的api,但我似乎无法为它创建正确类型的结构。


我试图编码的完整JSON位于此处。https://prices.runescape.wiki/api/v1/osrs/latest


JSON 的结构为


{

  "data": {

    "2": {

      "high": 182,

      "highTime": 1621811749,

      "low": 180,

      "lowTime": 1621811755

    },

    "6": {

      "high": 186683,

      "highTime": 1621811083,

      "low": 184528,

      "lowTime": 1621811286

    },

    ... REPEATS THOUSANDS OF TIMES ...

  }

}


我尝试过对 JSON 数据使用 JSON 到 Go 转换器,但这会返回一个完全太大的结构。(转到返回错误)我尝试手动制作一个带有切片的结构,如下所示


type osrsPrices []struct {

    ID struct {

        High     int `json:"high"`

        Hightime int `json:"highTime"`

        Low      int `json:"low"`

        Lowtime  int `json:"lowTime"`

    } `json:"id"`

}

每当我尝试从终端运行此命令时,我都会看到错误“json:无法将对象取消封入main.osrs类型的Go值退出状态1”


这是我正在使用的整个代码


package main


import (

    "encoding/json"

    "fmt"

    "io/ioutil"

    "log"

    "net/http"

    "time"

)


type osrsPrices []struct {

    ID struct {

        High     int `json:"high"`

        Hightime int `json:"highTime"`

        Low      int `json:"low"`

        Lowtime  int `json:"lowTime"`

    } `json:"id"`

}


func main() {

    url := "https://prices.runescape.wiki/api/v1/osrs/latest"


    spaceClient := http.Client{

        Timeout: time.Second * 2, // Timeout after 2 seconds

    }


    req, err := http.NewRequest(http.MethodGet, url, nil)

    if err != nil {

        log.Fatal(err)

    }


    req.Header.Set("User-Agent", "skillerscape:LearningGoLang|priceChecker")


    res, getErr := spaceClient.Do(req)

    if getErr != nil {

        log.Fatal(getErr)

    }


    if res.Body != nil {

        defer res.Body.Close()

    }


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

    if readErr != nil {

        log.Fatal(readErr)

    }


    items := osrsPrices{}

    jsonErr := json.Unmarshal(body, &items)

    if jsonErr != nil {

        log.Fatal(jsonErr)

    }


    for _, item := range items {

        fmt.Println(item)

    }


}

我很确定该错误与我尝试处理数据的方式有关,但是尽管经过几个小时的谷歌搜索,但我无法直接解决问题,也无法解决问题。我感谢任何人在这个问题上的任何帮助。


慕姐4208626
浏览 73回答 1
1回答

蝴蝶刀刀

在最深层次上,您拥有:type Price struct {   High     int `json:"high"`   Hightime int `json:"highTime"`   Low      int `json:"low"`   Lowtime  int `json:"lowTime"`}这是在具有可变键的对象中,因此您需要:type Data struct {   Data map[string]Price `json:"data"`}然后,您可以取消编组到此结构的实例中:var data Datajson.Unmarshal(input,&data)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go