可枚举改变了我的`to_json`行为

时间:2013-01-01 13:03:02

标签: ruby json ruby-on-rails-3.2 ruby-1.9.3 enumerable

我有一个rails应用程序和一个我写过的类作为它的一部分(不是ActiveRecord或任何东西......)。数据存储在简单的实例变量(字符串,整数,数组......)

当我在它的实例上调用to_json时,我得到了我期望的结果。一个JSON对象,也包含所有实例变量作为JSON对象。

但是,当我向类定义添加include Enumerable时,to_json的行为会发生变化,我会得到一个空对象:"[]"

知道为什么会这样吗? Enumerable以某种方式定义或取消定义影响to_json的内容吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

所以,会发生什么:

在ActiveSupport中加载Rails。 ActiveSupport将这些as_json方法(猴子补丁)注入到几个类和模块中,包括Enumerable

module Enumerable
  def as_json(options = nil) #:nodoc:
    to_a.as_json(options)
  end
end

你可能没有为each方法返回任何内容,因为to_a返回[],而"[]"返回.as_json,并且空数组被转换为字符串class A def as_json(*) Object.instance_method(:as_json).bind(self).call end end

您可以在此处将对象绑定到不可枚举的继承类中,并使用其➜ pry require 'active_support/all' => true class A def initialize @a = 1 end end => nil A.new.to_json => "{\"a\":1}" class A include Enumerable def each end end => nil A.new.to_json => "[]" class A def as_json(*) Object.instance_method(:as_json).bind(self).call end end => nil A.new.to_json => "{\"a\":1}" 方法。

像这样:

{{1}}

演示:

{{1}}