Cómo convertir JSON a un hash Ruby

137

Tengo un objeto JSON con el siguiente valor:

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

Quiero recorrerlo en Ruby para obtener los pares clave / valor. Cuando lo uso @each, no itera a través del objeto porque no está en la forma hash de Ruby:

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

¿Cómo puedo convertir el objeto JSON anterior a un hash Ruby?

verdura
fuente

Respuestas:

250

¿Qué pasa con el siguiente fragmento?

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}
WarHog
fuente
77
value = '{"val":"test","val1":"test1","val2":"test2"}'podría haber sido más legible.
luckykrrish
40

También puede usar el with_indifferent_accessmétodo de Rails para poder acceder al cuerpo con símbolos o cadenas.

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

luego

json[:val] #=> "test"

json["val"] #=> "test"
crims345
fuente
¿Alguien sabe si esto requiere más recursos para objetos hash más grandes? Soy nuevo en Ruby / Rails, pero ¿suponiendo que esto duplique pares clave-valor?
Jonathan
4

Suponiendo que tiene un hash JSON dando vueltas en algún lugar, para convertirlo automáticamente en algo así como la versión de WarHog, envuelva sus contenidos de hash JSON en %q{hsh}etiquetas.

Esto parece agregar automáticamente todo el texto escapado necesario como en la respuesta de WarHog.

boulder_ruby
fuente
4

¿Has probado: http://flori.github.com/json/ ?

De lo contrario, ¿podrías analizarlo? Si solo le interesan las matrices, algo para dividir lo anterior será bastante simple.

Nick Cartwright
fuente
1

Me sorprende que nadie haya señalado el []método de JSON , que hace que decodificar y codificar de / a JSON sea muy fácil y transparente.

Si el objeto tiene forma de cadena, analice la cadena y devuelva el resultado analizado como una estructura de datos Ruby. De lo contrario, genere un texto JSON a partir del objeto de estructura de datos Ruby y devuélvalo.

Considera esto:

require 'json'

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

strahora contiene el JSON codificado hash.

Es fácil revertirlo usando:

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

Los objetos personalizados deben to_sdefinirse para la clase, y dentro de ella se convierte el objeto en un hash y luego se usa to_jsonen él.

el hombre de hojalata
fuente
0

Puedes usar la 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]
Mario Ruiz
fuente