来自比特币api的Golang json查询返回无效字符

时间:2015-08-22 05:36:42

标签: json api go character

某事告诉我,我没有正确理解json。我试图从http://api.bitcoincharts.com/v1/trades.csv?symbol=rockUSD获取一些数据,但我的Unmarshal似乎无法读取json数据。我是一个新手的初学者(和json一样),我想知道我是如何能够跳过我犯的那个错误的角色错误。

我的错误:

invalid character ',' after top-level value
panic: invalid character ',' after top-level value

我的代码:

package main

import ("fmt"
    "net/http"
    "io/ioutil"
    "encoding/json"
)

type Prices struct {
    Data string
}

func main() {
    url := "http://api.bitcoincharts.com/v1/trades.csv?symbol=rockUSD"
    httpresp, err := http.Get(url)
    if err != nil{
        fmt.Println(err)
        panic(err)
    }
    defer httpresp.Body.Close()
    htmldata, err := ioutil.ReadAll(httpresp.Body)
    if err != nil{
        fmt.Println(err)
        panic (err)
    }
    var jsonData []Prices
    err = json.Unmarshal([]byte(htmldata), &jsonData)
    if err != nil {
        fmt.Println(err)
        panic (err)
    }
    fmt.Println(jsonData)

}

1 个答案:

答案 0 :(得分:2)

根本不是json数据,你必须编写一个自定义解析器。

示例:

.........
data := readData(httpresp.Body)
........

func readData(r io.Reader) (out [][3]float64) {
    br := bufio.NewScanner(r)
    for br.Scan() {
        parts := strings.Split(br.Text(), ",")
        if len(parts) != 3 {
            continue
        }
        var fparts [3]float64
        for i, p := range parts {
            // bad idea to ignore errors, but it's left as exercise for the reader.
            fparts[i], _ = strconv.ParseFloat(p, 64)
        }
        out = append(out, fparts)
    }
    return
}

playground