簡體   English   中英

為此 JSON 創建結構時遇到問題

[英]Having issues creating a struct for this 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 到 Go轉換器來獲取 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: cannot unmarshal object into Go value of type main.osrsPrices exit status 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)
    }

}

我很確定該錯誤與我嘗試處理數據的方式有關,但我無法直接找出問題,也無法找到解決方案,盡管谷歌搜索了幾個小時。 我感謝任何人在這個問題上的任何幫助。

在最深層次上,你有:

type Price struct {
   High     int `json:"high"`
   Hightime int `json:"highTime"`
   Low      int `json:"low"`
   Lowtime  int `json:"lowTime"`
}

這是在帶有可變鍵的 object 中,因此您需要:

type Data struct {
   Data map[string]Price `json:"data"`
}

然后你可以解組到這個結構的一個實例中:

var data Data
json.Unmarshal(input,&data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM