解组未命名对象的未命名JSON数组

时间:2014-03-06 00:12:36

标签: json go

我试图用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)
}

1 个答案:

答案 0 :(得分:4)

在这一行:

tradeResult := new(TradesResult)

您使用tradeResult类型声明*TradeResult变量。也就是说,指向切片的指针。您收到的错误是因为您无法在指向切片的指针上使用索引表示法。

解决此问题的一种方法是更改​​最后一行以使用(*tradeResult)[0].Amount。或者,您可以将tradeResult声明为:

var tradeResult TradeResult

json模块可以很好地解码到&tradeResult,你不需要取消引用它来索引切片。