Analizando una cadena JSON en Ruby
Tengo una cadena que quiero analizar en Ruby:
string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'
¿Existe una manera fácil de extraer los datos?
Esto se parece a la notación de objetos JavaScript (JSON) . Puede analizar JSON que reside en alguna variable, por ejemplo json_string
, así:
require 'json'
JSON.parse(json_string)
Si está utilizando un Ruby más antiguo, es posible que necesite instalar la gema json .
También existen otras implementaciones de JSON para Ruby que pueden adaptarse mejor a algunos casos de uso:
- Fijaciones YAJL C para Ruby
- JSON::Transmisión
Solo para ampliar un poco las respuestas sobre qué hacer con el objeto analizado:
# JSON Parsing example
require "rubygems" # don't need this if you're Ruby v1.9.3 or higher
require "json"
string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'
parsed = JSON.parse(string) # returns a hash
p parsed["desc"]["someKey"]
p parsed["main_item"]["stats"]["a"]
# Read JSON from a file, iterate over objects
file = open("shops.json")
json = file.read
parsed = JSON.parse(json)
parsed["shop"].each do |shop|
p shop["id"]
end
A partir de Ruby v1.9.3, no es necesario instalar ninguna gema para analizar JSON, simplemente use require 'json'
:
require 'json'
json = JSON.parse '{"foo":"bar", "ping":"pong"}'
puts json['foo'] # prints "bar"
Consulte JSON en Ruby-Doc.
Parece una cadena JSON. Puedes usar una de las muchas bibliotecas JSON y es tan simple como hacer:
JSON.parse(string)
No veo ninguna respuesta aquí que mencione el análisis directo de un objeto que no sea un Hash, pero es posible usar la opción object_class mal documentada (consulte https://ruby-doc.org/stdlib-2.7.1/libdoc/ json/rdoc/JSON.html ):
JSON.parse('{"foo":{"bar": 2}}', object_class: OpenStruct).foo.bar
=> 2
La mejor manera de leer esa opción es "La clase Ruby en la que se convierte un objeto json", lo que explica por qué su valor predeterminado es Hash. Asimismo, existe una opción array_class para matrices json.