Analizando una cadena JSON en Ruby

Resuelto Rod asked hace 13 años • 8 respuestas

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?

Rod avatar Mar 24 '11 02:03 Rod
Aceptado

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
Greg avatar Mar 23 '2011 19:03 Greg

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
nevan king avatar Nov 29 '2012 12:11 nevan king

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.

dav_i avatar Dec 15 '2015 17:12 dav_i

Parece una cadena JSON. Puedes usar una de las muchas bibliotecas JSON y es tan simple como hacer:

JSON.parse(string)
keymone avatar Mar 23 '2011 19:03 keymone

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.

Adverbly avatar Sep 25 '2020 13:09 Adverbly