Як конвертувати JSON в хеш Ruby


137

У мене об’єкт JSON містить таке значення:

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

Я хочу пропустити його через Ruby, щоб отримати пари ключ / значення. Коли я використовую @each, він не повторюється через об'єкт, оскільки він не знаходиться у формі хеша Ruby:

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

Як я можу перетворити вищевказаний об'єкт JSON в хеш Ruby?

Відповіді:


250

Що з наступним фрагментом?

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

7
value = '{"val":"test","val1":"test1","val2":"test2"}'могла бути читабельнішою.
luckykrrish

40

Ви також можете скористатися with_indifferent_accessметодом Rails, щоб мати доступ до тіла за допомогою символів або рядків.

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

тоді

json[:val] #=> "test"

json["val"] #=> "test"

Хтось знає, чи це більш ресурсомістке для великих хеш-об'єктів? Я новачок у Ruby / Rails, але припускаючи, що це дублює пари ключ-значення?
Джонатан

4

Припустимо, що у вас десь звисає хеш JSON, щоб автоматично перетворити його на щось на зразок версії WarHog, загортайте вміст хешу JSON у %q{hsh}теги.

Це здається, що автоматично додається весь необхідний текст, як у відповіді WarHog.


4

Ви пробували: http://flori.github.com/json/ ?

Якщо цього не зробити, ви могли просто розібратися? Якщо це лише масиви, які вас цікавлять, розділити вищесказане буде досить просто.


1

Я здивований, що ніхто не вказав на []метод JSON , що робить його дуже простим і прозорим для декодування та кодування з / в JSON.

Якщо об'єкт схожий на рядок, проаналізуйте рядок і поверніть проаналізований результат як структуру даних Ruby. В іншому випадку генеруйте текст JSON з об’єкта структури даних Ruby та поверніть його.

Врахуйте це:

require 'json'

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

strтепер містить закодований JSON hash.

Повернути його легко за допомогою:

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

to_sДля класу потрібно визначити спеціальні об'єкти , і всередині нього перетворити об'єкт у Hash, а потім використовувати to_jsonна ньому.


0

Ви можете використовувати дорогоцінний камінь 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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.