Analizando una cadena JSON en Ruby

359

Tengo una cadena que quiero analizar en Ruby:

string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'

¿Hay una manera fácil de extraer los datos?

varilla
fuente
22
JSON es directamente compatible con Ruby, y lo ha sido desde al menos Ruby v1.9.3, por lo que no es necesario instalar una gema a menos que esté usando algo más antiguo. Simplemente use require 'json'en su código.
El hombre de hojalata

Respuestas:

560

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 anterior, es posible que deba instalar la gema json .


También hay otras implementaciones de JSON para Ruby que pueden adaptarse mejor a algunos casos de uso:

Greg
fuente
32
También puede establecer la opción symbolize_names en true para obtener claves como símbolos. Ejemplo:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa
31
JSON es directamente compatible con Ruby, y lo ha sido desde al menos Ruby v1.9.3, por lo que no es necesario instalar una gema a menos que esté usando algo más antiguo. Simplemente use require 'json'en su código.
El hombre de hojalata
212

Solo para extender 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
fuente
Muy bien explicado.
berto77
77
Nota importante: '{ "a": "bob" }'es válida. "{ 'a': 'bob' }"no es.
Ziggy
77
@LinusAn porque JSON requiere comillas dobles alrededor de las cadenas. Vea la cadena en la definición JSON ( json.org ): "Una cadena es una secuencia de cero o más caracteres Unicode, entre comillas dobles, usando escapes de barra invertida".
endorama
1
En muchos casos, desea envolver JSON.parsedentro de un bloque de rescate JSON::ParserError.
johnml
JSON.parse("[#{value}]")[0]para evitar el errorA JSON text must at least contain two octets!
Rivenfall
39

A partir de Ruby v1.9.3 no necesita instalar ninguna Gema para analizar JSON, simplemente use require 'json':

require 'json'

json = JSON.parse '{"foo":"bar", "ping":"pong"}'
puts json['foo'] # prints "bar"

Ver JSON en Ruby-Doc.

dav_i
fuente
15

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

JSON.parse(string)
Keymone
fuente
7

Esto es un poco tarde, pero me encontré con algo interesante que parece importante para contribuir.

Accidentalmente escribí este código, y parece funcionar:

require 'yaml'
CONFIG_FILE = ENV['CONFIG_FILE'] # path to a JSON config file 
configs = YAML.load_file("#{CONFIG_FILE}")
puts configs['desc']['someKey']

Me sorprendió ver que funciona ya que estoy usando la biblioteca YAML, pero funciona.

La razón por la que es importante es que yamlviene incorporado con Ruby, por lo que no hay instalación de gemas.

Estoy usando las versiones 1.8.xy 1.9.x, por lo que la jsonbiblioteca no está integrada, pero está en la versión 2.x.

Técnicamente, esta es la forma más fácil de extraer los datos en una versión inferior a la 2.0.

chico mograbi
fuente
Sí, JSON en realidad es analizado por el código Psych, que también analiza YAML en Ruby. Y el análisis JSON se introdujo en Ruby v1.9.3 .
El hombre de hojalata
1
La razón por la que esto funciona es que semánticamente (la mayoría) JSON es válido YAML (particularmente YAML 1.2)
Justin Ohms