Comment convertir JSON en hachage Ruby

137

J'ai un objet JSON contenant la valeur suivante:

@value = {"val":"test","val1":"test1","val2":"test2"}

Je veux le parcourir en Ruby pour obtenir les paires clé / valeur. Lorsque j'utilise @each, il n'itère pas dans l'objet car il n'est pas sous la forme de hachage Ruby:

@value = {"val"=>"test","val1"=>"test1","val2"=>"test2"}

Comment puis-je convertir l'objet JSON ci-dessus en hachage Ruby?

verdure
la source

Réponses:

250

Qu'en est-il de l'extrait suivant?

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}
WarHog
la source
7
value = '{"val":"test","val1":"test1","val2":"test2"}'aurait pu être plus lisible.
luckykrrish
40

Vous pouvez également utiliser la with_indifferent_accessméthode de Rails pour accéder au corps avec des symboles ou des chaînes.

value = '{"val":"test","val1":"test1","val2":"test2"}'
json = JSON.parse(value).with_indifferent_access

puis

json[:val] #=> "test"

json["val"] #=> "test"
crims345
la source
Quelqu'un sait-il si cela demande plus de ressources pour les objets de hachage plus volumineux? Je suis nouveau sur Ruby / Rails, mais en supposant que cela duplique des paires clé-valeur?
Jonathan
4

En supposant que vous ayez un hachage JSON quelque part, pour le convertir automatiquement en quelque chose comme la version de WarHog, enveloppez votre contenu de hachage JSON dans des %q{hsh}balises.

Cela semble ajouter automatiquement tout le texte échappé nécessaire comme dans la réponse de WarHog.

boulder_ruby
la source
4

Avez-vous essayé: http://flori.github.com/json/ ?

À défaut, vous pourriez simplement l'analyser? Si ce ne sont que les tableaux qui vous intéressent, quelque chose pour séparer ce qui précède sera assez simple.

Nick Cartwright
la source
1

Je suis surpris que personne n'ait signalé la []méthode de JSON , ce qui rend très facile et transparent le décodage et l'encodage de / vers JSON.

Si l'objet est semblable à une chaîne, analysez la chaîne et retournez le résultat analysé sous la forme d'une structure de données Ruby. Sinon, générez un texte JSON à partir de l'objet de structure de données Ruby et renvoyez-le.

Considère ceci:

require 'json'

hash = {"val":"test","val1":"test1","val2":"test2"} # => {:val=>"test", :val1=>"test1", :val2=>"test2"}
str = JSON[hash] # => "{\"val\":\"test\",\"val1\":\"test1\",\"val2\":\"test2\"}"

strcontient maintenant le JSON encodé hash.

Il est facile de l'inverser en utilisant:

JSON[str] # => {"val"=>"test", "val1"=>"test1", "val2"=>"test2"}

Les objets personnalisés doivent être to_sdéfinis pour la classe, et à l'intérieur de celui-ci convertissent l'objet en Hash puis l'utiliser to_json.

l'homme d'étain
la source
0

Vous pouvez utiliser la gemme nice_hash: https://github.com/MarioRuiz/nice_hash

require 'nice_hash'
my_string = '{"val":"test","val1":"test1","val2":"test2"}'

# on my_hash will have the json as a hash, even when nested with arrays
my_hash = my_string.json

# you can filter and get what you want even when nested with arrays
vals = my_string.json(:val1, :val2)

# even you can access the keys like this:
puts my_hash._val1
puts my_hash.val1
puts my_hash[:val1]
Mario Ruiz
la source