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

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

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

Go
慕姐4208626 2022-09-26 14:57:59
我对golang非常非常陌生(使用这个项目作为更好地学习语言的一种方式)。我有一个想要从中提取数据的api,但我似乎无法为它创建正确类型的结构。我试图编码的完整JSON位于此处。https://prices.runescape.wiki/api/v1/osrs/latestJSON 的结构为{  "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 mainimport (    "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)    }}我很确定该错误与我尝试处理数据的方式有关,但是尽管经过几个小时的谷歌搜索,但我无法直接解决问题,也无法解决问题。我感谢任何人在这个问题上的任何帮助。
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

在最深层次上,您拥有:


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 Data

json.Unmarshal(input,&data)


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信