Ruby on rails 在从Ruby对象呈现JSON之前,如何将nil更改为null?

Ruby on rails 在从Ruby对象呈现JSON之前,如何将nil更改为null?,ruby-on-rails,ruby,json,activerecord,Ruby On Rails,Ruby,Json,Activerecord,我有一个像这样的arel对象: #<Event:0x000001097d5fa0> { :id => 6302, :zone_id => nil, :date => Thu, 02 Jan 2014 09:13:17 UTC +00:00, :status => 1, :created_at => Thu

我有一个像这样的arel对象:

#<Event:0x000001097d5fa0> {
                   :id => 6302,
              :zone_id => nil,
                 :date => Thu, 02 Jan 2014 09:13:17 UTC +00:00,
               :status => 1,
           :created_at => Thu, 02 Jan 2014 09:13:17 UTC +00:00,
           :updated_at => Fri, 03 Jan 2014 09:22:16 UTC +00:00,
          :description => "New alert",
        :controller_id => 699,
           :event_type => 10,
             :is_fault => false,
                :delta => true
    }
JSON验证器抱怨
nil
不是字符串。JSON应该是
null
,而不是字符串,所以我想我只是转换它,没什么大不了的

因此,我陷入了困境,我意识到我想在使用对象之前了解更多关于更新对象的信息

更新_属性会将记录保存回数据库-不希望这样。 assign_attributes只会更改对象中的属性值-确实需要这样做

但是

分配属性!实际上不会替换我的对象并将其推回到结果中

因此,对于我必须迭代一组散列(result),我尝试在适当的位置操作每个Ruby对象,然后通过render提供它

可能有更好的方法来解决这个问题,但这是我的目标。如何将nil更改为null?

您只需调用

render:json=>result.to_json

它将为您处理所有转换,包括
nil
null
,例如

require 'json'

[nil].to_json
#=> "[null]"
{blah: nil}.to_json
#=> "{\"blah\":null}"

对于我来说
nil.to_json
返回“null”。你能试试吗,比如在IRB中?这将不会输出JSON
null
,而是输出一个字符串“null”,该字符串不相同,甚至计算结果为true。@Chris它会输出JSON null。如果null在本例中是一个字符串,它将被括在引号中,而引号不是
{blah:nil}。to_json
将被转换为json,作为
{blah:null}
注意
null
没有被引用
nil.to_json
将为“null”,但当嵌套在
数组
散列
中时(这在json构造中更可能是
null
作为值而不是字符串)
require 'json'

[nil].to_json
#=> "[null]"
{blah: nil}.to_json
#=> "{\"blah\":null}"