ActiveSupport::JSON解码哈希丢失符号

7

我正在尝试序列化和反序列化一个哈希。当哈希进行反序列化时,键将被去除符号化;例如不再是 :one,而是 "one"。

从Rails控制台:

>>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/load。不过,我想提出一个问题,看看是否有办法将其保留在JSON格式中(只是为了可读性)。

2个回答

19

JSON.parse(j, {:symbolize_names => true})应该更好一些,因为它(我假设)从一开始就不会创建字符串键,因此对于具有相同键重复的大型哈希表来说,可以节省内存。


因此:JSON.parse(j, {:symbolize_names => true}).with_indifferent_access。请注意,这仅适用于Rails,因此例如由后台进程执行的普通Ruby类可能无法访问ActiveSupport定义的Hash方法.with_indifferent_access - Magne
PS:它也递归地表示键。 - Magne

10
h2 = ActiveSupport::JSON.decode(j).symbolize_keys

5
注意:这并不表示递归地符号化键。 - TelegramSam
Nor适用于包含JSON对象的数组,例如[{'id':1}, {'id': '2'}, ...]。但Tim Cull的解决方案有效。 - laffuste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接