So konvertieren Sie JSON in einen Ruby-Hash

137

Ich habe ein JSON-Objekt mit dem folgenden Wert:

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

Ich möchte es in Ruby durchlaufen, um die Schlüssel / Wert-Paare zu erhalten. Wenn ich es verwende @each, durchläuft es das Objekt nicht, da es nicht in der Ruby-Hash-Form vorliegt:

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

Wie kann ich das obige JSON-Objekt in einen Ruby-Hash konvertieren?

Grün
quelle

Antworten:

250

Was ist mit dem folgenden Ausschnitt?

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}
WarHog
quelle
7
value = '{"val":"test","val1":"test1","val2":"test2"}'hätte besser lesbar sein können.
Luckykrrish
40

Sie können auch die Rails- with_indifferent_accessMethode verwenden, um mit Symbolen oder Zeichenfolgen auf den Body zuzugreifen.

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

dann

json[:val] #=> "test"

json["val"] #=> "test"
crims345
quelle
Weiß jemand, ob dies für größere Hash-Objekte ressourcenintensiver ist? Ich bin neu bei Ruby / Rails, aber unter der Annahme, dass dies Schlüssel-Wert-Paare dupliziert?
Jonathan
4

Angenommen, Sie haben irgendwo einen JSON-Hash, um ihn automatisch in eine WarHog-Version zu konvertieren, verpacken Sie Ihren JSON-Hash-Inhalt in %q{hsh}Tags.

Dies scheint automatisch den gesamten erforderlichen maskierten Text hinzuzufügen, wie in WarHogs Antwort.

boulder_ruby
quelle
4

Haben Sie versucht: http://flori.github.com/json/ ?

Gelingt dies nicht, könnten Sie es einfach analysieren? Wenn Sie nur an Arrays interessiert sind, ist es recht einfach, die oben genannten Punkte aufzuteilen.

Nick Cartwright
quelle
1

Ich bin überrascht, dass niemand auf die []Methode von JSON hingewiesen hat , die es sehr einfach und transparent macht, von / nach JSON zu dekodieren und zu kodieren.

Wenn das Objekt einem String ähnelt, analysieren Sie den String und geben Sie das analysierte Ergebnis als Ruby-Datenstruktur zurück. Andernfalls generieren Sie einen JSON-Text aus dem Ruby-Datenstrukturobjekt und geben Sie ihn zurück.

Bedenken Sie:

require 'json'

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

strEnthält jetzt den JSON-Code hash.

Es ist einfach, es umzukehren mit:

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

Benutzerdefinierte Objekte müssen to_sfür die Klasse definiert werden. Darin wird das Objekt in einen Hash konvertiert und anschließend verwendet to_json.

der Blechmann
quelle
0

Sie können das Juwel nice_hash verwenden: 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
quelle