doupingtang9627 2017-06-05 04:41
浏览 67
已采纳

去解码JSON字符串

discovered that go json decoding is a big pain in the butt so please help. Here's my json:

 {  
   "BTC_BCN":{  
      "id":7,
      "last":"0.00000156",
      "lowestAsk":"0.00000156",
      "highestBid":"0.00000155",
      "percentChange":"0.01960784",
      "baseVolume":"4920.84786257",
      "quoteVolume":"3016048494.19305944",
      "isFrozen":"0",
      "high24hr":"0.00000183",
      "low24hr":"0.00000145"
   },
   "BTC_BELA":{  
      "id":8,
      "last":"0.00008847",
      "lowestAsk":"0.00008848",
      "highestBid":"0.00008847",
      "percentChange":"-0.00405268",
      "baseVolume":"169.66498061",
      "quoteVolume":"1981232.44495809",
      "isFrozen":"0",
      "high24hr":"0.00008995",
      "low24hr":"0.00008120"
   }, ...
}

So I need to put that in a type that I created

//Crypto is the currency object
type Crypto struct {
    iso           string //this is the key (ex: BTC_BCN)
    id            int
    last          float64
    lowestAsk     float64
    highestBid    float64
    percentChange float64
    baseVolume    float64
    quoteVolume   float64
    isFrozen      int
    high24hr      float64
    low24hr       float64
}

and here is what I did so far, but I ended up with the keys in place and an empty value

func main() {
    // sendEmail("Some text")
    currencies := getCurrencies()
    if currencies == nil {
        return
    }
    fmt.Println(len(currencies))

}

func getCurrencies() map[string]Crypto {
    curList := make(map[string]Crypto)
    resp, err := http.Get("https://poloniex.com/public?command=returnTicker")
    // fmt.Println(err)
    if err != nil {
        sendEmail("Error getting data from poloniex " + err.Error())
        return nil
    }
    body, readErr := ioutil.ReadAll(resp.Body)
    reader := strings.NewReader(string(body))
    jsonErr := json.NewDecoder(reader).Decode(&curList)
    // fmt.Printf("curList is : %#v
", curList)
    // fmt.Printf("body is : %s
", string(body))
    if readErr != nil {
        fmt.Printf("readErr: %s
", readErr.Error())
    }
    if jsonErr != nil {
        fmt.Printf("jsonErr: %s
", jsonErr.Error())
    }
    for k, v := range curList {
        fmt.Println("k:", k, "v:", v)
    }
    defer resp.Body.Close()
    return curList
}

output:

k: BTC_MAID v: {0 0 0 0 0 0 0 0 0 0}
k: BTC_NOTE v: {0 0 0 0 0 0 0 0 0 0}
k: BTC_VRC v: {0 0 0 0 0 0 0 0 0 0}
k: BTC_DOGE v: {0 0 0 0 0 0 0 0 0 0}...

Please excuse my stupid question but I've spent days on it and I think I am missing something. Cheers.

  • 写回答

2条回答 默认 最新

  • dongxiaoguang9108 2017-06-05 04:55
    关注
    //Crypto is the currency object
    type Crypto struct {
        Iso           string //this is the key (ex: BTC_BCN)
        Id            int
        Last          string
        LowestAsk     string
        HighestBid    string
        PercentChange string
        BaseVolume    string
        QuoteVolume   string
        IsFrozen      int
        High24hr      string
        Low24hr       string
    }
    

    You need to to export the fields by capitalising first character. On top of that, your float64 datas are in type: string,hence either you read as string or format before assign to object Crypto.


    Updated:

    As pointed by @skomp, you may use a tag to annotate the type you're receiving from json file.

    type Crypto struct {
        CryptoKey
        Id            int
        Last          float64 `json:"last,string"`
        LowestAsk     float64 `json:"lowestAsk,string"`
        HighestBid    float64 `json:"highestBid,string"`
        PercentChange float64 `json:"percentChange,string"`
        BaseVolume    float64 `json:"baseVolume,string"`
        QuoteVolume   float64 `json:"quoteVolume,string"`
        IsFrozen      int
        High24hr      float64 `json:"high24hr,string"`
        Low24hr       float64 `json:"low24hr,string"`
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog