Como converter JSON em um hash Ruby


137

Eu tenho um objeto JSON segurando o seguinte valor:

@value = {"val":"test","val1":"test1","val2":"test2"}

Eu quero fazer um loop através dele em Ruby para obter os pares chave / valor. Quando uso @each, ele não percorre o objeto porque não está no formato de hash Ruby:

@value = {"val"=>"test","val1"=>"test1","val2"=>"test2"}

Como posso converter o objeto JSON acima em um hash Ruby?

Respostas:


250

E o trecho a seguir?

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}

7
value = '{"val":"test","val1":"test1","val2":"test2"}'poderia ter sido mais legível.
luckykrrish

40

Você também pode usar o with_indifferent_accessmétodo Rails para acessar o corpo com símbolos ou strings.

value = '{"val":"test","val1":"test1","val2":"test2"}'
json = JSON.parse(value).with_indifferent_access

então

json[:val] #=> "test"

json["val"] #=> "test"

Alguém sabe se isso consome mais recursos para objetos hash maiores? Eu sou novo no Ruby / Rails, mas supondo que isso duplique pares de valores-chave?
Jonathan

4

Supondo que você tenha um hash JSON pendurado em algum lugar, para convertê-lo automaticamente em algo como a versão do WarHog, envolva o conteúdo do hash JSON em %q{hsh}tags.

Isso parece adicionar automaticamente todo o texto escapado necessário, como na resposta do WarHog.



1

Estou surpreso que ninguém tenha apontado o []método JSON , o que torna muito fácil e transparente decodificar e codificar de / para JSON.

Se o objeto for do tipo string, analise a string e retorne o resultado analisado como uma estrutura de dados Ruby. Caso contrário, gere um texto JSON a partir do objeto de estrutura de dados Ruby e retorne-o.

Considere isto:

require 'json'

hash = {"val":"test","val1":"test1","val2":"test2"} # => {:val=>"test", :val1=>"test1", :val2=>"test2"}
str = JSON[hash] # => "{\"val\":\"test\",\"val1\":\"test1\",\"val2\":\"test2\"}"

stragora contém o JSON codificado hash.

É fácil reverter usando:

JSON[str] # => {"val"=>"test", "val1"=>"test1", "val2"=>"test2"}

Objetos personalizados precisam ser to_sdefinidos para a classe e, dentro dele, converte o objeto em um Hash e depois o utiliza to_json.


0

Você pode usar a gema nice_hash: https://github.com/MarioRuiz/nice_hash

require 'nice_hash'
my_string = '{"val":"test","val1":"test1","val2":"test2"}'

# on my_hash will have the json as a hash, even when nested with arrays
my_hash = my_string.json

# you can filter and get what you want even when nested with arrays
vals = my_string.json(:val1, :val2)

# even you can access the keys like this:
puts my_hash._val1
puts my_hash.val1
puts my_hash[:val1]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.