我对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)
- 1 回答
- 0 关注
- 72 浏览
添加回答
举报
0/150
提交
取消