Stefanos.Ioannou Stefanos.Ioannou - 3 months ago 12
Ruby Question

Getting rates from an array - json

I am trying to get the rates from this website.

So I connect with

website = Faraday.get('https://bitpay.com/api/rates')).status == 200
and then try to parse this.

A segment of the response I get is:

#<Faraday::Response:0x007fcf1ce25688
@env=
#<struct Faraday::Env
method=:get,
body=
"[{\"code\":\"BTC\",\"name\":\"Bitcoin\",\"rate\":1}, {\"code\":\"USD\",\"name\":\"US Dollar\",\"rate\":586.66},{\"code\":\"EUR\",\"name\":\"Eurozone Euro\",\"rate\":528.991322},{\"code\":\"GBP\",\"name\":\"Pound Sterling\",\"rate\":449.441986},{\"code\":\"JPY\",\"name\":\"Japanese Yen\",\"rate\":59907.95922},{\"code\":\"CAD\",\"name\"


When I do a website.body I get a String class of all these values found on that website. I want to parse them though (JSON?) so that I can get each rate as a float.

I tried something
JSON.parse(website.body)["GBP"]["rate"].to_f
but yet again it cannot work in a string.

The return I get is
TypeError: no implicit conversion of String into Integer


I was having a similar (but not the same) format from a different rates website and this is how I was handling it. Do I need to change its format first or is there a different way around it?

Answer

You're trying to access to the parsed JSON with the key "GBP" but you have an array. It's like if you did

a = [1,2,3,4,5]
a['foo']

Try out

currencies = JSON.parse(website.body)
currencies.each { |currency| puts currency['rate'] }

and change it like you need

Comments