Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

como converter uma String para Hash?

Tem como converter uma string no formato abaixo para uma hash?

{"referencia": "outubro de 2018", "fipe_codigo": "001267-0", "name": "Palio 1.0 ECONOMY Fire Flex 8V 4p", "combustivel": "Gasolina", "marca": "Fiat", "ano_modelo": "2013", "preco": "R$ 22.533,00", "key": "palio-2013", "time": 0.0, "id": "2013"}
5 respostas

Oi Filipe, isso não já seria um hash, dicionário? Olha uns exemplos aqui: https://guru-sp.github.io/tutorial_ruby/hashes-ruby.html

eu deu um puts carro.class ele me respondeu que é uma string, acredito que eu deveria converter de alguma forma. segue abaixo o código que eu estou estudando como mexer com APIs.

require 'uri'
require 'net/http'

veiculo = "21"

url = URI("http://fipeapi.appspot.com/api/1/carros/veiculo/#{veiculo}/001267-0/2013-1.json")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
#request["authorization"] = 'Basic c2FuZGJveEBwcm9jb2IuY29tOlRlc3RlQXBp'

response = http.request(request)
puts response.read_body

carro = response.read_body

puts carro.class

vou olhar o link que vc me passou Vânia. Se eu tento usá-lo como um hash:

puts carro[:referencia]

ocorre: testeurl.rb:18:in []': no implicit conversion of Symbol into Integer (TypeError) from testeurl.rb:18:in

'

tentei fazer da seguinte forma: carro = Hash.new(response.read_body) agora consegui converter, mas não aceita as manipulações do hash, estranho né?

solução!

Oi Felipe, eu pesquisei aqui e vi que tem um método que faz isso, da string pro hash, deu certo. Testa aí:

require 'uri'
require 'net/http'

veiculo = "21"

url = URI("http://fipeapi.appspot.com/api/1/carros/veiculo/#{veiculo}/001267-0/2013-1.json")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
#request["authorization"] = 'Basic c2FuZGJveEBwcm9jb2IuY29tOlRlc3RlQXBp'

response = http.request(request)
# puts response.read_body

carro = response.read_body

puts carro.class
puts carro


carro = eval(response.read_body)

puts carro.class
puts carro

puts carro[:name]

O nome do método é eval();

A saída do código ficou
String
{"referencia": "outubro de 2018", "fipe_codigo": "001267-0", "name": "Palio 1.0 ECONOMY Fire Flex 8V 4p", "combustivel": "Gasolina", "marca": "Fiat", "ano_modelo": "2013", "preco": "R$ 22.533,00", "key": "palio-2013", "time": 0.0, "id": "2013"}
Hash
{:referencia=>"outubro de 2018", :fipe_codigo=>"001267-0", :name=>"Palio 1.0 ECONOMY Fire Flex 8V 4p", :combustivel=>"Gasolina", :marca=>"Fiat", :ano_modelo=>"2013", :preco=>"R$ 22.533,00", :key=>"palio-2013", :time=>0.0, :id=>"2013"}
Palio 1.0 ECONOMY Fire Flex 8V 4p

INCRÍVEL!!!!!!!!!!