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”=> “真”}
答案 0 :(得分:1)
这就是它的实施方式。
您可以更改将其置于初始值设定项中的默认行为:
class TrueClass
def as_json(*options)
self
end
end
class FalseClass
def as_json(*options)
self
end
end