猿问

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

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

}

]

我可以成功解组对象并将完整tradesResult数组打印为 %#v,但是当我尝试访问数组元素时,出现以下错误。


prog.go:41: invalid operation: tradeResult[0] (index of type *TradesResult)

以下是您可以运行以尝试解决问题的示例代码:


// 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)

}


慕桂英4014372
浏览 210回答 1
1回答

幕布斯7119047

在这一行:tradeResult := new(TradesResult)您正在tradeResult使用*TradeResult类型声明变量。即,指向切片的指针。您收到的错误是因为您不能在指向切片的指针上使用索引表示法。解决此问题的一种方法是将最后一行更改为使用(*tradeResult)[0].Amount. 或者,您可以声明tradeResult为:var tradeResult TradeResult该json模块将能够&tradeResult很好地解码,并且您不需要取消引用它来索引切片。
随时随地看视频慕课网APP

相关分类

Go
我要回答