2011-03-04 69 views
5

我想序列化和反序列化哈希。當散列被刪除時,這些鍵被去符號化;例如不是更多:一個,而不是「一個」。ActiveSupport :: JSON解碼哈希丟失符號

從鐵軌控制檯:

>>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 

我切換到使用Marshal.dump /負載現在。然而,我想把它放在那裏,看看是否有一種方法可以將它保存在JSON中(僅僅爲了便於閱讀)。

回答

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

備註:這是不是象徵的鑰匙遞歸。 – TelegramSam 2011-04-04 20:48:49

+0

也不適用於包含JSON對象的數組,即'[{'id':1},{'id':'2'},...]'。蒂姆卡爾解決方案工作壽。 – laffuste 2014-05-07 08:23:20

16

JSON.parse(j, {:symbolize_names => true})應該是稍微好一點,因爲它(我認爲)從來沒有在第一時間創建字符串鍵,從而節省內存對於大型哈希有相同的密鑰經常反覆

+0

我想人們真正想要的是一個https://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess,所以它的工作原理就像Rails默認的那樣,即:允許'h ['one']'和'h [:one ]' – Magne 2017-11-17 11:25:53

+0

所以:'JSON.parse(j,{:symbolize_names => true})。with_indifferent_access'。請注意,這僅適用於Rails,因此後臺進程執行的普通舊Ruby類可能無法訪問ActiveSupport定義的Hash方法'.with_indifferent_access'。 – Magne 2017-11-17 11:31:21

+0

PS:它也遞歸地表示鍵。 – Magne 2017-11-17 11:55:21