【问题标题】:ActiveSupport::JSON decode hash losing symbolsActiveSupport::JSON 解码散列丢失符号
【发布时间】:2011-07-08 21:32:44
【问题描述】:

我正在尝试序列化和反序列化哈希。当散列被去轨道化时,密钥被去符号化;例如不是更多:一个,而是“一个”。

从 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 中(只是为了便于阅读)。

【问题讨论】:

    标签: ruby-on-rails ruby json


    【解决方案1】:

    JSON.parse(j, {:symbolize_names => true}) 应该稍微好一点,因为它(我假设)从不首先创建字符串键,因此可以为大型散列节省内存,并且经常重复相同的键

    【讨论】:

    • 我猜人们真正想要的是apidock.com/rails/ActiveSupport/HashWithIndifferentAccess,所以它的工作方式就像 Rails 默认情况下那样,即:允许h['one']h[:one]
    • 所以:JSON.parse(j, {:symbolize_names => true}).with_indifferent_access。请注意,这仅适用于 Rails,因此例如由后台进程执行的普通旧 Ruby 类可能无法访问 ActiveSupport 定义的 Hash 方法 .with_indifferent_access
    • PS:它也递归地表示键。
    【解决方案2】:
    h2 = ActiveSupport::JSON.decode(j).symbolize_keys
    

    【讨论】:

    • 注意:这并不是递归地表示键。
    • 也不适用于包含 JSON 对象的数组,即[{'id':1}, {'id': '2'}, ...]。 Tim Cull 解决方案很有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2017-11-10
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多