2017-06-05 21 views
1

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

出力:

私のばかげた質問をお許しください。しかし、私はそれに日を費やして、私は何かが欠けていると思います。 乾杯。

答えて

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は、この構造体*の中の*フィールドの名前ではなく、このstruct *を含むフィールドの名前です。 – Adrian

関連する問題