Левентікс, дякую за вашу відповідь.
Marshal.load (Marshal.dump (ч)) ймовірно, має найбільш цілісність різних методів, оскільки він зберігає оригінальні типи ключів рекурсивно .
Це важливо, якщо у вас є вкладений хеш із сумішшю рядків та символьних клавіш, і ви хочете зберегти цю суміш при декодуванні (наприклад, це може статися, якщо ваш хеш містить ваші власні власні об’єкти на додаток до дуже складних / вкладених третіх об'єкти-учасники, ключами яких ви не можете маніпулювати / перетворювати з будь-якої причини, наприклад обмеження часу проекту).
Наприклад:
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
для рейок 4.1