[英]How to Unmarshall key-less JSON array in Golang correctly?
我有如下所示的JSON數據:
[
{
"globalTradeID": 64201000,
"tradeID": 549285,
"date": "2016-11-11 23:51:58",
"type": "buy",
"rate": "10.33999779",
"amount": "0.02176472",
"total": "0.22504715"
},
{
"globalTradeID": 64200631,
"tradeID": 549284,
"date": "2016-11-11 23:48:39",
"type": "buy",
"rate": "10.33999822",
"amount": "0.18211700",
"total": "1.88308945"
}...
]
我試圖通過定義類型來解組此JSON:
type TradeHistoryResponse []TradeHistoryInfo
type TradeHistoryInfo struct {
GlobalTradeID int64 `json:"globalTradeID"`
TradeID int64 `json:"tradeID"`
Date string `json:"date"`
Type string `json:"type"`
Rate float64 `json:"rate,string"`
Amount float64 `json:"amount,string"`
Total float64 `json:"total,string"`
}
然后像這樣拉JSON數據:
//Read response
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("[Poloniex] (doRequest) Failed to parse response for query to %s! (%s)", reqURL, err.Error())
}
//Convert JSON to struct
var THR TradeHistoryResponse
err = json.Unmarshal(body, &THR)
if err != nil {
return nil, fmt.Errorf("[Poloniex] (doRequest) Failed to convert response into JSON for query to %s! (%s)", reqURL, err.Error())
}
我收到以下錯誤:
(json: cannot unmarshal object into Go value of type poloniex.TradeHistoryResponse)
我最好的猜測是為什么Unmarshall不起作用是因為數組沒有密鑰?
希望就如何最好地解決此問題進行澄清。
我不認為像您打算的那樣在JSON中解組一個數組實際上是可行的,但是對於編碼/ json的支持卻確實如此。 示例代碼:package main
import (
"encoding/json"
"fmt"
"log"
)
var mjs string = "[" +
"{" +
`"globalTradeID": 64201000,
"tradeID": 549285,
"date": "2016-11-11 23:51:58",
"type": "buy",
"rate": "10.33999779",
"amount": "0.02176472",
"total": "0.22504715"
},
{
"globalTradeID": 64200631,
"tradeID": 549284,
"date": "2016-11-11 23:48:39",
"type": "buy",
"rate": "10.33999822",
"amount": "0.18211700",
"total": "1.88308945"
}
]`
type TradeHistoryResponse []TradeHistoryInfo
type TradeHistoryInfo struct {
GlobalTradeID int64 `json:"globalTradeID"`
TradeID int64 `json:"tradeID"`
Date string `json:"date"`
Type string `json:"type"`
Rate float64 `json:"rate,string"`
Amount float64 `json:"amount,string"`
Total float64 `json:"total,string"`
}
func main() {
//Convert JSON to struct
var THR TradeHistoryResponse
err := json.Unmarshal([]byte(mjs), &THR)
if err != nil {
log.Fatal(err)
}
for _, v := range THR {
fmt.Printf("%+v", v)
fmt.Printf("\n")
}
}
這將按預期打印所有值。 因此將json值轉換為float / int也不會有問題(這是我的第二個猜測)。
您確定沒有以任何方式修改Body嗎? 您提供的示例涵蓋了所有極端情況嗎?
您能否添加:
fmt.Println(string(body))
到第二個錯誤塊並在此處記錄它給出的錯誤。
另外,您使用的是哪個版本的go? 我不會排除在版本之間更改encoding / json的可能性。 最后,如果確實如此,那么簡單的解決方法就是將您的響應作為字符串,刪除所有空格並在“}'{”處進行拆分,如下所示:
fmtBody := strings.Replace(string(body), "\n", "", -1)
fmtBody = strings.Replace(string(fmtBody), "\w", "", -1)
fmtBody = strings.Replace(string(fmtBody), "[", "", -1)
fmtBody = strings.Replace(string(fmtBody), "]", "", -1)
var goArrOfYourJsonsObj []String = strings.Split(fmtBody, "},{")
for k, _ := range goArrOfYourJsonsObj {
goArrOfYourJsonsObj[k] += "}"
}
現在,您已經將JSON對象整齊地分成了一個String類型的go數組,可以在Unmarshall中將其用作[] byte(val)。
TradeHistoryResponse是沒有變量的類型,您必須創建一個TradeHistoryResponse類型的變量,如下所示:
var th TradeHistoryResponse
//Convert JSON to struct
err = json.Unmarshal(body, &th)
// ...
fmt.Printf("%+v\n", th)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.