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

not*_*ceo 2 ruby activerecord json ruby-on-rails

我有一个像这样的 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
    }
Run Code Online (Sandbox Code Playgroud)

当我渲染 :json => result (结果是一堆这些)时,它会打印出来:

{"controller_id"=>699, "created_at"=>"2014-01-02T09:13:17Z", "date"=>"2014-01-02T09:13:17Z", "delta"=>true, "description"=>"New alert", "event_type"=>10, "id"=>6302, "is_fault"=>false, "status"=>1, "updated_at"=>"2014-01-03T09:22:16Z", "zone_id"=>nil}
Run Code Online (Sandbox Code Playgroud)

并且 JSON 验证器抱怨nil不是字符串。JSON 应该null不是字符串,所以我想我只是转换它,没什么大不了的。

所以我陷入了困境,我意识到我想了解更多关于在对它做某事之前就地更新对象的信息。

update_attributes 会将记录保存回数据库 - 不希望那样。assign_attributes 只会改变对象中的属性值 - 想要这个。

分配_属性!实际上并没有替换我的对象并将其推回到结果中。

因此,对于我必须遍历哈希数组(结果)的某些事情,我试图在原地操作每个 Ruby 对象,然后通过渲染提供它。

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

eng*_*nky 5

你只需要打电话

render :json => result.to_json

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

require 'json'

[nil].to_json
#=> "[null]"
{blah: nil}.to_json
#=> "{\"blah\":null}"
Run Code Online (Sandbox Code Playgroud)