更新:即使使用 Rails 3.2,同样的问题仍未解决。就是强行加载 json gem 并覆盖它的讨厌的 hack。
最终我得到了下面的代码,完全绕过了 ActiveSupport 的to_json
。把它放进去config/initializers/patches.rb
,就可以做{}.jsonize
或者[].jsonize
生成JSON字符串了。保证不会与任何事物发生冲突。
# Undo the effect of 'active_support/core_ext/object/to_json'
require 'json'
[Object, Array, Hash].each do |klass|
klass.class_eval <<-RUBY, __FILE__, __LINE__
def jsonize(options = nil)
::JSON.generate self, :quirks_mode => true
end
RUBY
end
这 8 行代码使您的应用程序的 JSON 编码速度提高了50 倍。可能你也想做同样的事情。:)
在 Rails 2.3.8 之前,我一直有类似的问题。
问题是这ActiveSupport::JSON.backend = 'JSONGem'
是一个半途而废的解决方案,您仍然需要自己覆盖一些编码器。(警告:对于使用 MultiJson 的 Rails 3.x,它必须ActiveSupport::JSON.backend = :json_gem
至少是,否则它将默默无操作。)
就我而言,我需要覆盖String#to_json
,因为 JSON gem 1.4.3 更好,因为它不会以不必要的形式盲目编码非 ascii-but-valid-UTF8 字符"\uXXXX"
,因此您可以获得更短的字节(好用于序列化)和易于阅读的结果("日本語"
在我看来比 看起来更性感"\u65e5\u672c\u8a9e"
)。
这是我一直在使用的猴子补丁 - 将以下代码放入config/initializers/patches.rb
module ActiveSupport
module JSON
module Encoding
class << self
def escape(string)
::JSON.generate([string])[1..-2]
end
end
end
end
end
你可以自由地使用to_json
任何东西——字符串、数组和哈希。