2011-03-04 16 views
5

Bir hash serileştirmeye ve seri hale getirmeye çalışıyorum. Karma, deserailize edildiğinde, tuşlar de-sembolize edilir; Örneğin. daha fazla değil: bir, daha doğrusu "bir". raylar konsolundanActiveSupport :: JSON decode karma sembolleri kaybediliyor

:

>>h = { :one =>1, :two => "two"} 
{:one=>1, :two=>"two"} 
>>j = ActiveSupport::JSON.encode(h) 
"{\"one\":1,\"two\":\"two\"}" 
>>h2 = ActiveSupport::JSON.decode(j) 
{"one"=>1, "two"=>"two"} 
>>h2[:one] 
nil 
>>h[:one] 
1 

şimdilik Marshal.dump/yük sonucu geçtik. Bununla birlikte, bunu JSON'da (okunabilirlik için) saklamanın bir yolu olup olmadığını görmek için dışarı atmak istedim. Bu anahtarlar sembolize değildir: o (ı varsayalım) asla ilk etapta dize anahtarlarını oluşturur ve dolayısıyla aynı tuşlarıyla büyük karmaları için bellek tasarrufu

cevap

8
h2 = ActiveSupport::JSON.decode(j).symbolize_keys 
+5

Not sıklıkla tekrarlanan çünkü – TelegramSam

+0

Ayrıca, JSONs nesnelerini içeren bir dizi için de çalışır, yani [['id': 1}, {'id': '2'}, ...] '. Tim Cull çözümü tho çalışıyor. – laffuste

16

JSON.parse(j, {:symbolize_names => true})

biraz daha iyi olmalı yinelemeli.
+0

İnsanların gerçekten ne istediğini tahmin ediyorum, https://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess, bu yüzden Rails varsayılan olarak çalışır, yani: her ikisi de 'h [' one '] 've' h ​​[: one ] – Magne

+0

So: 'JSON.parse (j, {: symbolize_names => true}). With_indifferent_access'. Bunun sadece Rails'de çalıştığını unutmayın, örneğin, arka plan işlemleri tarafından yürütülen düz eski Ruby sınıfları, ActiveSupport'un tanımladığı Hash yöntemi '.with_indifferent_access' erişemeyebilir. – Magne

+0

PS: Aynı zamanda tuşları tekrarlayan şekilde sembolize eder. – Magne