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?


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:


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

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.


15

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

JSON.parse(string)

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.


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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.