Analyser une chaîne JSON dans Ruby

359

J'ai une chaîne que je veux analyser en Ruby:

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

Existe-t-il un moyen simple d'extraire les données?

Barre
la source
22
JSON est directement pris en charge dans Ruby, et depuis au moins Ruby v1.9.3, il n'est donc pas nécessaire d'installer une gemme à moins que vous n'utilisiez quelque chose de plus ancien. Utilisez simplement require 'json'dans votre code.
The Tin Man

Réponses:

560

Cela ressemble à la notation d'objet JavaScript (JSON) . Vous pouvez analyser JSON qui réside dans une variable, par exemple json_string, comme ceci:

require 'json'
JSON.parse(json_string)

Si vous utilisez un Ruby plus ancien, vous devrez peut-être installer la gemme json .


Il existe également d'autres implémentations de JSON pour Ruby qui peuvent mieux s'adapter à certains cas d'utilisation:

Greg
la source
32
Vous pouvez également définir l'option symbolize_names sur true, afin d'obtenir des clés sous forme de symboles. Exemple:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa
31
JSON est directement pris en charge dans Ruby, et depuis au moins Ruby v1.9.3, il n'est donc pas nécessaire d'installer une gemme à moins que vous n'utilisiez quelque chose de plus ancien. Utilisez simplement require 'json'dans votre code.
The Tin Man
212

Juste pour étendre un peu les réponses avec ce qu'il faut faire avec l'objet analysé:

# 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
la source
très bien expliqué.
berto77
7
Remarque importante: '{ "a": "bob" }'est valide. "{ 'a': 'bob' }"n'est pas.
Ziggy
7
@LinusAn car JSON nécessite des guillemets doubles autour des chaînes. Voir chaîne dans la définition JSON ( json.org ): "Une chaîne est une séquence de zéro ou plusieurs caractères Unicode, entourée de guillemets doubles, utilisant des échappements antislash."
endorama
1
Dans de nombreux cas, vous souhaitez vous envelopper JSON.parsedans un bloc de sauvetage JSON::ParserError.
johnml
JSON.parse("[#{value}]")[0]pour éviter l'erreurA JSON text must at least contain two octets!
Rivenfall
39

Depuis Ruby v1.9.3, vous n'avez pas besoin d'installer de gemmes pour analyser JSON, utilisez simplement require 'json':

require 'json'

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

Voir JSON sur Ruby-Doc.

dav_i
la source
15

Il ressemble à une chaîne JSON. Vous pouvez utiliser l'une des nombreuses bibliothèques JSON et c'est aussi simple que cela:

JSON.parse(string)
keymone
la source
7

C'est un peu tard mais je suis tombé sur quelque chose d'intéressant qui semble important de contribuer.

J'ai accidentellement écrit ce code, et il semble fonctionner:

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

J'ai été surpris de voir que cela fonctionne depuis que j'utilise la bibliothèque YAML, mais cela fonctionne.

La raison pour laquelle il est important est qu'il yamlsoit intégré à Ruby, il n'y a donc pas d'installation de gemmes.

J'utilise les versions 1.8.x et 1.9.x - donc la jsonbibliothèque n'est pas intégrée, mais elle est dans la version 2.x.

Donc, techniquement - c'est le moyen le plus simple d'extraire les données dans une version inférieure à 2.0.

guy mograbi
la source
Oui, JSON est en fait analysé par le code Psych, qui analyse également YAML en Ruby. Et l'analyse JSON a été introduite dans Ruby v1.9.3 .
The Tin Man
1
La raison pour laquelle cela fonctionne est que JSON sémantiquement (la plupart) est YAML valide (en particulier YAML 1.2)
Justin Ohms
4

Ces données semblent être au format JSON.

Vous pouvez utiliser cette implémentation JSON pour Ruby pour l'extraire.

Justin Ethier
la source