rails hash.as_json方法用布尔值产生意外结果

时间:2011-06-19 22:43:40

标签: ruby-on-rails json serialization activerecord

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

我可以非常简洁地总结这个错误:

{"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”=>是的,从as_json回来的是{“foo”=> “真”}

1 个答案:

答案 0 :(得分:1)

这就是它的实施方式。

您可以更改将其置于初始值设定项中的默认行为:

class TrueClass
  def as_json(*options)
    self
  end
end

class FalseClass
  def as_json(*options)
    self
  end
end