Как преобразовать 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"}
WarHog
источник
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"
crims345
источник
Кто-нибудь знает, является ли это более ресурсоемким для больших хэш-объектов? Я новичок в Ruby / Rails, но при условии, что это дублирует пары ключ-значение?
Джонатан
4

Предполагая, что у вас есть где-то хеш JSON, чтобы автоматически преобразовать его в нечто вроде версии WarHog, оберните содержимое вашего хэша JSON в %q{hsh} теги.

Это, кажется, автоматически добавляет весь необходимый экранированный текст, как в ответе WarHog.

boulder_ruby
источник
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определены для класса, и внутри него конвертировать объект в хэш, а затем использовать 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]
Марио Руис
источник