Leventix, спасибо за ваш ответ.
Marshal.load (Marshal.dump (h)) , вероятно, имеет наибольшую целостность различных методов, поскольку он сохраняет исходные типы ключей рекурсивно .
Это важно в случае, если у вас есть вложенный хэш со смесью ключей строк и символов, и вы хотите сохранить это сочетание при декодировании (например, это может произойти, если ваш хэш содержит ваши собственные пользовательские объекты в дополнение к очень сложным / вложенные сторонние объекты, ключи которых вы не можете манипулировать / конвертировать по какой-либо причине, например, ограничения по времени проекта).
например:.
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 - это путь.
Приветствия