Leventix, cevabın için teşekkürler.
Marshal.load (Marshal.dump (h)) , orijinal anahtar türlerini korur çünkü yöntemi, muhtemelen çeşitli yöntemlerin çoğu bütünlüğü vardır yinelemeli .
Bu, dize ve sembol anahtarlarının bir karışımını içeren iç içe geçmiş bir hash'iniz olması ve kod çözme işleminin ardından bu karışımı korumak istemeniz durumunda önemlidir (örneğin, hash'iniz çok karmaşık / iç içe geçmiş üçüncü öğeye ek olarak kendi özel nesnelerinizi içeriyorsa bu olabilir. - Proje süresi kısıtlaması gibi, anahtarlarını herhangi bir nedenle değiştiremeyeceğiniz / dönüştüremeyeceğiniz parti nesneleri).
Örneğin:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
Yöntem 1 : JSON.parse - tüm anahtarları özyinelemeli olarak sembolize eder => Orijinal karışımı korumaz
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
Yöntem 2 : ActiveSupport :: JSON.decode - yalnızca en üst düzey anahtarları sembolize eder => Orijinal karışımı korumaz
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
Yöntem 3 : Marshal.load - yuvalanmış anahtarlarda orijinal dize / sembol karışımını korur. MÜKEMMEL!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
Farkında olmadığım bir dezavantaj olmadıkça, Yöntem 3'ün gidilecek yol olduğunu düşünüyorum.
Şerefe
http://stackoverflow.com/a/43773159/1297435
4.1 rayları için deneyin