Ruby on Rails 为许多常用类添加了“as_json”方法,它将 ActiveRecord 对象转换为哈希对象,然后可以将其发送到 JSON 序列化程序。最近我在我的代码中遇到了一个与此方法相关的错误,它是对 bool 值的处理。
我可以非常简洁地总结这个错误:
{"foo" => true}.as_json
我希望此方法返回相同的哈希值。相反,它返回
{"foo" => "true"}
这似乎是设计使然,根据 encoding.rb 中的第 157 行
AS_JSON = ActiveSupport::JSON::Variable.new('true').freeze
我可以问一下,为什么 rails 返回字符串值“true”而不是将其保留为真正的 bool 值?
我的错误如下:我将 JSON 序列化对象保存在缓存中。当我将它们从缓存中拉出时,我将它们保留为哈希以避免不必要的对象反序列化。如果在缓存中找不到它,我将对象从数据库中拉出并调用 as_json 。我希望我从缓存中提取的内容和从 as_json 返回的内容是相同的。它们不是,因为从缓存中出来的是 {"foo"=> true} 而从 as_json 返回的是 {"foo"=> "true"}
最佳答案
这就是它的实现方式。
您可以更改将其放入初始化程序的默认行为:
class TrueClass
def as_json(*options)
self
end
end
class FalseClass
def as_json(*options)
self
end
end
关于ruby-on-rails - rails hash.as_json 方法产生带有 bool 值的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6405539/