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?


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:


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

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.


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)

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.


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



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.