Cara mengonversi JSON menjadi hash Ruby

139

Saya memiliki objek JSON yang memegang nilai berikut:

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

Saya ingin mengulanginya di Ruby untuk mendapatkan pasangan kunci / nilai. Ketika saya menggunakan @each, itu tidak melakukan iterasi melalui objek karena tidak dalam bentuk hash Ruby:

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

Bagaimana cara mengonversi objek JSON di atas menjadi hash Ruby?

kehijauan
sumber

Jawaban:

259

Bagaimana dengan cuplikan berikut?

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}
WarHog
sumber
7
value = '{"val":"test","val1":"test1","val2":"test2"}'bisa lebih mudah dibaca.
luckykrrish
42

Anda juga dapat menggunakan with_indifferent_accessmetode Rails sehingga Anda dapat mengakses body dengan simbol atau string.

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

kemudian

json[:val] #=> "test"

json["val"] #=> "test"
crims345
sumber
Adakah yang tahu jika ini lebih intensif sumber daya untuk objek hash yang lebih besar? Saya baru mengenal Ruby / Rails, tetapi menganggap ini duplikat pasangan nilai kunci?
Jonathan
Ya Tuhan, ini adalah penyelamat setelah 2 jam mencari solusi "sederhana". Terima kasih!!
tidelake
4

Dengan asumsi Anda memiliki hash JSON yang berkeliaran di suatu tempat, untuk secara otomatis mengubahnya menjadi sesuatu seperti versi WarHog, bungkus konten hash JSON Anda dalam %q{hsh}tag.

Ini tampaknya secara otomatis menambahkan semua teks lolos yang diperlukan seperti dalam jawaban WarHog.

boulder_ruby
sumber
4

Sudahkah Anda mencoba: http://flori.github.com/json/ ?

Jika gagal, Anda bisa menguraikannya? Jika itu hanya array yang Anda minati, sesuatu untuk membagi di atas akan sangat sederhana.

Nick Cartwright
sumber
3

Saya terkejut tidak ada yang menunjukkan []metode JSON , yang membuatnya sangat mudah dan transparan untuk mendekode dan menyandikan dari / ke JSON.

Jika objek seperti string, parsing string tersebut dan kembalikan hasil parsing sebagai struktur data Ruby. Jika tidak, buat teks JSON dari objek struktur data Ruby dan kembalikan.

Pertimbangkan ini:

require 'json'

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

strsekarang berisi JSON yang dikodekan hash.

Mudah untuk membalikkannya menggunakan:

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

Objek khusus perlu to_sditentukan untuk kelas, dan di dalamnya mengubah objek menjadi Hash kemudian digunakan to_jsondi atasnya.

Manusia Timah
sumber
0

Anda dapat menggunakan permata 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
sumber