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.