亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 JSON 數組 API 響應轉換為結構

將 JSON 數組 API 響應轉換為結構

Go
阿波羅的戰車 2022-08-30 15:19:05
使用Go,我希望查詢API端點并將結果輸出到Gorm SQLite數據庫。這之前(這里)已經完成,但我需要自己編寫代碼。API端點返回一個JSON數組,對于數組中的每個交易,我想將其放入一個結構中,然后將其作為行添加到SQLite數據庫中。結構定義如下:type Trade struct {    TradeID      int64  `json:"id"`    Price        string `json:"price"`    Qty          string `json:"qty"`    QuoteQty     string `json:"quoteQty"`    Time         int64  `json:"time"`    IsBuyerMaker bool   `json:"isBuyerMaker"`    IsBestMatch  bool   `json:"isBestMatch"`}這些類型可能看起來很奇怪,但是通過使用以下代碼的PowerShell來確定的:PS C:\Git> $body = @{"symbol" = "ETHEUR";"limit" = 1000}PS C:\Git> $response = Invoke-RestMethod https://api.binance.com/api/v3/trades -Body $bodyPS C:\Git> $response[0] | gm   TypeName: System.Management.Automation.PSCustomObjectName         MemberType   Definition----         ----------   ----------Equals       Method       bool Equals(System.Object obj)GetHashCode  Method       int GetHashCode()GetType      Method       type GetType()ToString     Method       string ToString()id           NoteProperty long id=21731777isBestMatch  NoteProperty bool isBestMatch=TrueisBuyerMaker NoteProperty bool isBuyerMaker=Trueprice        NoteProperty string price=3539.03000000qty          NoteProperty string qty=0.28600000quoteQty     NoteProperty string quoteQty=1012.16258000time         NoteProperty long time=1620822731248因此,到目前為止,我擁有的Go函數如下:func getTrade(symbol string, limit int) {    uri := fmt.Sprintf("https://api.binance.com/api/v3/trades?symbol=%v&limit=%v", symbol, limit)    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})    if err != nil {        panic("failed to connect database")    }    // Create the fields in the database based on the Trade Struct    db.AutoMigrate(&Trade{})    // Query Binance API endpoint    response, err := http.Get(uri)    // Log if an error occurred    if err != nil {        log.Fatalln(err)    }    // Defer closing object    defer response.Body.Close()    // Create trade struct    trade := Trade{}我感到非??ㄗ。拖裎义e過了與編組有關的東西一樣,有人可以幫助我嗎?
查看完整描述

3 回答

?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

由于 JSON 響應是一個數組,因此需要將其取消編組為結構切片。確保還使用正確的 Go 類型。用于 JSON 編號。float64


type Trade struct {

    TradeID      float64 `json:"id"`

    Price        string  `json:"price"`

    Qty          string  `json:"qty"`

    QuoteQty     string  `json:"quoteQty"`

    Time         float64 `json:"time"`

    IsBuyerMaker bool    `json:"isBuyerMaker"`

    IsBestMatch  bool    `json:"isBestMatch"`

}


func main() {

    symbol := "ETHEUR"

    limit := 1000

    uri := fmt.Sprintf("https://api.binance.com/api/v3/trades?symbol=%v&limit=%v", symbol, limit)

    response, err := http.Get(uri)

    if err != nil {

        fmt.Println(err)

    }

    body, err := ioutil.ReadAll(response.Body)

    if err != nil {

        fmt.Println(err)

    }

    defer response.Body.Close()

    trade := []Trade{}

    err = json.Unmarshal([]byte(body), &trade)

    if err != nil {

        fmt.Println(err)

    }

    fmt.Println(trade)

}


查看完整回答
反對 回復 2022-08-30
?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

如果我們有一個json樣本(模擬),以了解由于json是否存在確切的問題,可能會有所幫助。

我懷疑,因為你有一個你之前提到的結構的ARRAY,你應該在a上做一個unmarshal,而不是一個Final for json類型,有一種規則集,當你做一個unmarshal時,但只有當你的字段ar類型:[]Trade{}Trade{}interface{}

http://img1.sycdn.imooc.com//630dba1300018e6a07280180.jpg

查看完整回答
反對 回復 2022-08-30
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

如果你正在獲取json數組,我假設它們是json對象的數組,每個對象都包含你定義的結構的json。如下面的示例所示。


[

  {

    "id": 1,

    "price": "111",

    "qty": "20",

    "quoteQty": "100",

    "time": 6039484,

    "isBuyerMaker": true,

    "isBestMatch": false

  },

  {

    "id": 2,

    "price": "222",

    "qty": "20",

    "quoteQty": "100",

    "time": 6039484,

    "isBuyerMaker": true,

    "isBestMatch": false

  },

  {

    "id": 3,

    "price": "333",

    "qty": "20",

    "quoteQty": "100",

    "time": 6039484,

    "isBuyerMaker": true,

    "isBestMatch": false

  }

]如果你正在獲取json數組,我假設它們是json對象的數組,每個對象都包含你定義的結構的json。如下面的示例所示。


[

  {

    "id": 1,

    "price": "111",

    "qty": "20",

    "quoteQty": "100",

    "time": 6039484,

    "isBuyerMaker": true,

    "isBestMatch": false

  },

  {

    "id": 2,

    "price": "222",

    "qty": "20",

    "quoteQty": "100",

    "time": 6039484,

    "isBuyerMaker": true,

    "isBestMatch": false

  },

  {

    "id": 3,

    "price": "333",

    "qty": "20",

    "quoteQty": "100",

    "time": 6039484,

    "isBuyerMaker": true,

    "isBestMatch": false

  }

]

在代碼中,需要執行這些操作。

  1. 聲明一個交易結構的切片,

  2. 執行此數據到該切片的 json 解編組

  3. 循環訪問切片以獲取每個 json 對象上的處理程序。

  4. 現在,您可以形成一個 sql 查詢并訪問每個 json 對象的 json 值,并對數據庫進行查詢。

像這樣的東西。

// Assuming r is your default http.Request handler, get the complete request body

byteSlice, err := ioutil.ReadAll(r.Body)

    if err != nil {

        log.Println("Error in reading request body")

    }


var trades []Trade


if err = json.Unmarshal(byteSlice, &trades); err != nil {

        log.Println("Error in json unmarshal")

        http.Error(w, err.Error(), http.StatusBadRequest)

        return

    }


for _, trade := range trades {

        log.Println("Trade ID: ", trade.TradeID)

        // Call a function and pass each trade object

        err := triggerSQLQuery(trade)

        if err != nil {

          log.Println(err.Error())

        }

    }



func triggerSQLQuery(trade Trade) error {

  // Access trade object and form an sql query and execute it.

}


查看完整回答
反對 回復 2022-08-30
  • 3 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號