dqcj32855
2014-03-06 00:12
浏览 69
已采纳

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

The JSON I am trying to unmarshal with Go is unnamed array of unnamed objects:

[
{
    "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"
}
]

I can successfully unmarshal the object and print the complete tradesResult array as %#v, but when I try to access element of the array I get the following error.

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

Here is example code you can run to try the problem:

// 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
", err)
    }
    json_response, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("%s
", err)
    }
    resp.Body.Close()
    fmt.Printf("JSON:
%s
", json_response)
    tradeResult := new(TradesResult)
    err = json.Unmarshal(json_response, &tradeResult)
    if err != nil {
        fmt.Printf("%s
", err)
    }
    // Printing trade result first element Amount
    fmt.Printf("Element 0 Amount: %v
", tradeResult[0].Amount)
}
  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

  • doq8211 2014-03-06 00:24
    最佳回答

    On this line:

    tradeResult := new(TradesResult)
    

    You are declaring the tradeResult variable using the *TradeResult type. That is, a pointer to a slice. The error you received is because you can't use index notation on a pointer to a slice.

    One way to fix this would be to change the last line to use (*tradeResult)[0].Amount. Alternatively, you could declare tradeResult as:

    var tradeResult TradeResult
    

    The json module will be able to decode into &tradeResult just fine, and you won't need to dereference it to index into the slice.

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题