Левентикс, спасибо за ответ.
Метод Marshal.load (Marshal.dump (h)), вероятно, имеет наибольшую целостность среди различных методов, поскольку он рекурсивно сохраняет исходные типы ключей .
Это важно, если у вас есть вложенный хэш со смесью строковых и символьных ключей, и вы хотите сохранить это сочетание при декодировании (например, это может произойти, если ваш хеш содержит ваши собственные пользовательские объекты в дополнение к очень сложным / вложенным третьим -party объекты, ключи которых вы не можете манипулировать / преобразовывать по какой-либо причине, например временные ограничения проекта).
Например:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
Метод 1 : JSON.parse - рекурсивно символизирует все ключи => Не сохраняет исходный микс
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
Метод 2 : ActiveSupport :: JSON.decode - символизирует только ключи верхнего уровня => Не сохраняет исходный микс
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
Метод 3 : Marshal.load - сохраняет исходное сочетание строки / символа во вложенных ключах. ИДЕАЛЬНЫЙ!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
Если нет недостатка, о котором я не знаю, я бы подумал, что метод 3 - это правильный путь.
Ура
http://stackoverflow.com/a/43773159/1297435
для rails 4.1