1

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

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 Answers 2

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 } 

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"` } 
Sign up to request clarification or add additional context in comments.

1 Comment

Regarding floats in strings: a tag can help: {... Last float64 `json:"last,string"`...}, this also allows you to keep the names in the json separated from the names in the struct.
1

You are trying to decode in to a map containing your crypto object. This is incorrect. Create the mappings in the struct definition like so:

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) 

2 Comments

The problem is with the 'iso' it is dynamic, I get that from an API call and I never know what new isos I will get.
This doesn't make any sense - BTC_BCN is the name of the field that contains this struct, not the name of a field in this struct.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.