【问题标题】:rails hash.as_json method producing unexpected result with boolean valuerails hash.as_json 方法产生带有布尔值的意外结果
【发布时间】:2011-09-18 07:57:37
【问题描述】:

Ruby on Rails 将“as_json”方法添加到许多通用类中,它将 ActiveRecord 对象转换为哈希对象,然后可以将其发送到 JSON 序列化程序。最近我在我的代码中遇到了一个与此方法相关的错误,它是对布尔值的处理。

我可以很简洁地总结一下这个bug:

{"foo" => true}.as_json

我希望这个方法返回一个相同的哈希值。相反,它返回

{"foo" => "true"}

这似乎是设计使然,根据 encoding.rb 中的第 157 行

AS_JSON = ActiveSupport::JSON::Variable.new('true').freeze

请问,为什么 rails 会返回字符串值“true”而不是将其保留为真正的布尔值?

我的错误如下:我将 JSON 序列化的对象保存在缓存中。当我将它们从缓存中拉出时,我将它们保留为哈希以避免不必要的对象反序列化。如果在缓存中找不到它,我将对象从数据库中拉出并调用 as_json 。我希望我从缓存中提取的内容和从 as_json 返回的内容是相同的。它们不是,因为从缓存中出来的是 {"foo" => true} 而从 as_json 返回的是 {"foo" => "true"}

【问题讨论】:

    标签: ruby-on-rails json serialization activerecord


    【解决方案1】:

    这就是它的实现方式。

    您可以更改默认行为,将其放入初始化程序中:

    class TrueClass
      def as_json(*options)
        self
      end
    end
    
    class FalseClass
      def as_json(*options)
        self
      end
    end
    

    【讨论】:

    • 对,我知道它是如何实现的,但不知道有什么理由我对改变它的行为持谨慎态度,以免我破坏另一个组件。
    • 我认为 Rails 中没有任何 json 交换,所以你不应该害怕这个。
    猜你喜欢
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多