我试图用Go解组的JSON是未命名的未命名对象数组:
[
{
"date": 1394062029,
"price": 654.964,
"amount": 5.61567,
"tid": 31862774,
"price_currency": "USD",
"item": "BTC",
"trade_type": "ask"
},
{
"date": 1394062029,
"price": 654.964,
"amount": 0.3,
"tid": 31862773,
"price_currency": "USD",
"item": "BTC",
"trade_type": "ask"
},
{
"date": 1394062028,
"price": 654.964,
"amount": 0.0193335,
"tid": 31862772,
"price_currency": "USD",
"item": "BTC",
"trade_type": "bid"
}
]
我可以成功解组对象并以%#v打印完整的tradesResult
数组,但是当我尝试访问数组的元素时,我收到以下错误。
prog.go:41: invalid operation: tradeResult[0] (index of type *TradesResult)
Here是您可以运行以尝试解决问题的示例代码:
// You can edit this code!
// Click here and start typing.
package main
import (
"fmt"
"io/ioutil"
"net/http"
"encoding/json"
)
type TradesResultData struct {
Date float64 `json:"date"`
Price float64 `json:"price"`
Amount float64 `json:"amount"`
Trade float64 `json:"tid"`
Currency string `json:"price_currency"`
Item string `json:"item"`
Type string `json:"trade_type"`
}
type TradesResult []TradesResultData
func main() {
resp, err := http.Get("https://btc-e.com/api/2/btc_usd/trades")
if err != nil {
fmt.Printf("%s\r\n", err)
}
json_response, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("%s\r\n", err)
}
resp.Body.Close()
fmt.Printf("JSON:\r\n%s\r\n", json_response)
tradeResult := new(TradesResult)
err = json.Unmarshal(json_response, &tradeResult)
if err != nil {
fmt.Printf("%s\r\n", err)
}
// Printing trade result first element Amount
fmt.Printf("Element 0 Amount: %v\r\n", tradeResult[0].Amount)
}
答案 0 :(得分:4)
在这一行:
tradeResult := new(TradesResult)
您使用tradeResult
类型声明*TradeResult
变量。也就是说,指向切片的指针。您收到的错误是因为您无法在指向切片的指针上使用索引表示法。
解决此问题的一种方法是更改最后一行以使用(*tradeResult)[0].Amount
。或者,您可以将tradeResult
声明为:
var tradeResult TradeResult
json
模块可以很好地解码到&tradeResult
,你不需要取消引用它来索引切片。