Analisi di una stringa JSON in Ruby


359

Ho una stringa che voglio analizzare in Ruby:

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

C'è un modo semplice per estrarre i dati?


22
JSON è direttamente supportato in Ruby ed è stato almeno da Ruby v1.9.3, quindi non è necessario installare una gemma a meno che non si stia usando qualcosa di più vecchio. Basta usare require 'json'nel tuo codice.
— Tin Man,

Risposte:


560

Questo sembra JavaScript Object Notation (JSON) . È possibile analizzare JSON che risiede in alcune variabili, ad json_stringesempio in questo modo:

require 'json'
JSON.parse(json_string)

Se stai usando un Ruby più vecchio, potrebbe essere necessario installare la gemma JSON .


Esistono anche altre implementazioni di JSON per Ruby che potrebbero adattarsi meglio ad alcuni casi d'uso:


32
Inoltre puoi impostare l'opzione symbolize_names su true, al fine di ottenere le chiavi come simboli. Esempio:JSON.parse(string, symbolize_names: true) #=> {key: :value}
— Nando Sousa,

31
JSON è direttamente supportato in Ruby ed è stato almeno da Ruby v1.9.3, quindi non è necessario installare una gemma a meno che non si stia usando qualcosa di più vecchio. Basta usare require 'json'nel tuo codice.
— Tin Man,

212

Solo per estendere un po 'le risposte con cosa fare con l'oggetto analizzato:

# 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

molto ben spiegato.
— berto77,

7
Nota importante: '{ "a": "bob" }'è valido. "{ 'a': 'bob' }"non è.
— Ziggy,

7
@LinusAn perché JSON richiede virgolette doppie attorno alle stringhe. Vedi stringa nella definizione JSON ( json.org ): "Una stringa è una sequenza di zero o più caratteri Unicode, racchiusi tra virgolette doppie, usando escape di barra rovesciata."
— Endorama,

1
In molti casi si desidera avvolgere JSON.parsein un blocco di salvataggio per JSON::ParserError.
— johnml,

JSON.parse("[#{value}]")[0]per evitare l'erroreA JSON text must at least contain two octets!
— Rivenfall

39

A partire da Ruby v1.9.3 non è necessario installare Gemme per analizzare JSON, basta usare require 'json':

require 'json'

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

Vedi JSON su Ruby-Doc.


15

Sembra una stringa JSON. Puoi usare una delle tante librerie JSON ed è semplice come fare:

JSON.parse(string)

7

È un po 'tardi, ma mi sono imbattuto in qualcosa di interessante che sembra importante contribuire.

Ho scritto per errore questo codice e sembra funzionare:

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

Sono stato sorpreso di vedere che funziona dal momento che sto usando la libreria YAML, ma funziona.

Il motivo per cui è importante è che yamlè integrato con Ruby, quindi non c'è installazione gemma.

Sto usando le versioni 1.8.xe 1.9.x - quindi la jsonlibreria non è integrata, ma è nella versione 2.x.

Quindi tecnicamente: questo è il modo più semplice per estrarre i dati nella versione precedente alla 2.0.


Sì, JSON è in realtà analizzato dal codice Psych, che analizza anche YAML in Ruby. E l'analisi JSON è stata introdotta in Ruby v1.9.3 .
— Tin Man,

1
La ragione per cui funziona è che JSON è semanticamente (la maggior parte) valida YAML (in particolare YAML 1.2)
— Justin Ohms,


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.