我对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)
}
}
我很确定该错误与我尝试处理数据的方式有关,但是尽管经过几个小时的谷歌搜索,但我无法直接解决问题,也无法解决问题。我感谢任何人在这个问题上的任何帮助。
蝴蝶刀刀
相关分类