Как преобразовать JSON в хэш Ruby

#ruby #json #hashmap

#ruby #json #hashmap

Вопрос:

У меня есть объект JSON, содержащий следующее значение:

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

Я хочу перебрать его в Ruby, чтобы получить пары ключ / значение. Когда я использую @each , он не выполняет итерацию по объекту, потому что он не находится в форме Ruby hash:

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

Как я могу преобразовать приведенный выше объект JSON в хэш Ruby?

Ответ №1:

Как насчет следующего фрагмента?

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

Комментарии:

1. value = '{"val":"test","val1":"test1","val2":"test2"}' могло бы быть более читабельным.

Ответ №2:

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

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

затем

 json[:val] #=> "test"

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

Комментарии:

1. Кто-нибудь знает, является ли это более ресурсоемким для больших хеш-объектов? Я новичок в Ruby / Rails, но предполагаю, что это дублирует пары ключ-значение?

2. О Боже, это было спасением после 2 часов поиска «простого» решения. Спасибо!!

Ответ №3:

Я удивлен, что никто не указал на [] метод 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 его.

Ответ №4:

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

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

Ответ №5:

Вы можете использовать драгоценный камень 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]