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.