2017-06-05 134 views
1

发现去json解码是一个很大的痛苦,所以请帮助。 这里是我的JSON:去解码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" 
    }, ... 
} 

所以我需要把在我创建

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

这里一类是我做过什么,到目前为止,但我结束了键到位,一个空值

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\n", curList) 
    // fmt.Printf("body is : %s\n", string(body)) 
    if readErr != nil { 
     fmt.Printf("readErr: %s\n", readErr.Error()) 
    } 
    if jsonErr != nil { 
     fmt.Printf("jsonErr: %s\n", jsonErr.Error()) 
    } 
    for k, v := range curList { 
     fmt.Println("k:", k, "v:", v) 
    } 
    defer resp.Body.Close() 
    return curList 
} 

输出:

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}... 

请原谅我的愚蠢问题,但我花了几天的时间,我想我错过了一些东西。 干杯。

回答

2
//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 
} 

你需要通过资本第一个字符导出的字段。最重要的是,您的float64数据类型为:string,因此您可以在将其分配给对象Crypto之前以字符串或格式读取。


更新时间:

正如指出的@skomp,您可以使用标签来标注你从JSON文件接收的类型。

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"` 
} 
+0

谢谢,伙计!工作。 –

+1

关于字符串中的浮点数:标记可以帮助:'{... Last float64 \'json:“last,string”\'...'},这也允许您将名称与名称分开在结构中。 – skomp

1

您正试图解码包含您的加密对象的地图。这是不正确的。创建结构定义的映射,像这样:

type Crypto struct { 
    iso   string `json:"BTC_BCN"` //this is the key (ex: BTC_BCN) 
    id   int  `json:"id"` 
    last   float64 `json:"las"` 
    ... 
} 

crypto := &Crypto{} 
err = json.NewDecoder(reader).Decode(crypto) 
+0

问题是与'ISO'它是动态的,我从API调用得到,我永远不知道我会得到什么新的isos。 –

+0

这没有任何意义 - BTC_BCN是*包含此结构*的字段的名称,而不是此结构*中字段*的名称。 – Adrian