ruby-on-rails - rails hash.as_json 方法产生带有 bool 值的意外结果

标签 ruby-on-rails json serialization activerecord

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/

相关文章:

ruby-on-rails - 如何在 Ruby on Rails 中将人类术语转换回数字?

ruby-on-rails - 无法在 Rails 中正确删除 session

ruby-on-rails - 获取哈希符号后的请求部分

java - 对特定 json 元素上的 jsonobjects 数组列表进行排序

c# - 如何序列化包含其他类对象的类(递归序列化?)

serialization - 为内存中的数据结构增加持久性

ruby-on-rails - 如果请求是 xhr,Rails 有没有办法跳过 before_filter?

php - 从 JSON 填充选择列表

python - 如何从包含 header 和正文的响应中提取 JSON 数据?

database - Golang DB反/序列化方法(数据库/sql之上的sqlx)