首页 > 解决方案 > 在 Go 中获取嵌套的 JSON 数据

问题描述

我一直遇到同样的问题,即从嵌套的 JSON 中获取数据。

结构看起来像这样,我对解决方案的尝试如下。

我收到的错误是“response.Result.Bid undefined”我已经解码了 JSON 响应,所以我不太明白这里发生了什么。当我尝试追加到数组时发生错误。

我将不胜感激,如果你们有任何与此主题相关的好资源,我可以阅读有关 lmk 的信息,因为我一直遇到同样的问题。我不是编程背景,我是一名数学家。

type MarketPrices struct {
    Success bool `json:"success"`
    Result  []struct {
        Name           string      `json:"name"`
        Basecurrency   interface{} `json:"baseCurrency"`
        Quotecurrency  interface{} `json:"quoteCurrency"`
        Type           string      `json:"type"`
        Underlying     string      `json:"underlying"`
        Enabled        bool        `json:"enabled"`
        Ask            float64     `json:"ask"`
        Bid            float64     `json:"bid"`
        Last           float64     `json:"last"`
        Postonly       bool        `json:"postOnly"`
        Priceincrement float64     `json:"priceIncrement"`
        Sizeincrement  float64     `json:"sizeIncrement"`
        Restricted     bool        `json:"restricted"`
    } `json:"result"`
}
func Spot_Price() []float64 {
    res, err := http.Get("https://ftx.com/api/markets/BTC/USD")
    if err != nil {
        log.Fatal(err)
    }

    var arr []float64

    var response MarketPrices
    json.NewDecoder(res.Body).Decode(&response)

    arr = append(arr, response.Result.Bid)

    arr = append(arr, response.Result.Ask)

    return arr
}

标签: jsongostruct

解决方案


对于问题 [1] 中的实际响应,不返回任何切片。这将是响应的更好建模:

package main

import (
   "encoding/json"
   "fmt"
   "net/http"
)

type MarketPrices struct {
   Success bool
   Result struct {
      Ask, Bid, Last, Priceincrement, Sizeincrement  float64
      Basecurrency, Name, Quotecurrency, Type, Underlying     string
      Enabled, Postonly, Restricted     bool
   }
}

func request() (*MarketPrices, error) {
   res, err := http.Get("https://ftx.com/api/markets/BTC/USD")
   if err != nil { return nil, err }
   defer res.Body.Close()
   response := new(MarketPrices)
   json.NewDecoder(res.Body).Decode(response)
   return response, nil
}

func main() {
   price, err := request()
   if err != nil {
      panic(err)
   }
   fmt.Printf("%+v\n", price)
}
  1. https://ftx.com/api/markets/BTC/USD

推荐阅读