我很难过这个问题.
ActiveSupport::JSON
定义to_json
了各种核心对象,JSON gem也是如此.但是,实现方式并不相同 - ActiveSupport版本接受参数而JSON gem版本不接受参数.
我安装了一个需要JSON gem的gem,我的应用程序坏了.问题是我to_json
在一个返回对象列表的控制器中使用,但我想控制返回哪些属性.
当我的系统中的任何地方的代码,我require 'json'
收到此错误消息:
TypeError: wrong argument type Hash (expected Data)
我尝试了一些我在网上阅读的东西来修复它,但没有任何效果.我最终重新编写了宝石ActiveSupport::JSON.decode
而不是使用JSON.parse
.
这可行,但它不可持续......每次我想要使用需要JSON gem的gem时,我都不能分享宝石.
更新:此问题的最佳解决方案是升级到Rails 2.3或更高版本,修复它.
更新:即使使用Rails 3.2,同样的问题仍未解决.令人讨厌的黑客强行加载json gem并覆盖它,就是这样.
最终我得到了以下代码,完全绕过了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更好,因为它不会以"\uXXXX"
不必要的形式盲目编码非ascii-but-valid-UTF8字符,所以你得到更短的字节(好)对于序列化)和易于阅读的结果("???"
看起来比我的眼睛更性感"\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
任何东西 - String,Array和Hash.