UPDATE: Even with Rails 3.2, the same problem remains unfixed. The nasty hack to forcibly load the json gem and overwrite it, that is.
Eventually I ended up with the following code, to entirely bypass ActiveSupport's to_json
completely. Put it in config/initializers/patches.rb
, and you can do {}.jsonize
or [].jsonize
to generate JSON string. No conflicts with anything, guaranteed.
# 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
The 8 lines of code make your app 50 times faster for JSON encoding. Probably you want to do the same. :)
I've been having a similar problem up until Rails 2.3.8.
The problem is that ActiveSupport::JSON.backend = 'JSONGem'
is a half-assed solution and you still need to overwrite some encoders yourself. (WARNING: for Rails 3.x, which uses MultiJson, it must be ActiveSupport::JSON.backend = :json_gem
at least, or it will be silently no-op.)
In my case, I needed to overwrite String#to_json
because JSON gem 1.4.3 is better in that it doesn't blindly encode non-ascii-but-valid-UTF8 characters in the form of "uXXXX"
where it's not necessary, so you get shorter bytes (good for serialization) and easy-to-read results ("日本語"
looks much sexier to my eyes than "u65e5u672cu8a9e"
).
Here's the monkey patch that I've been using - put the following code in 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
and you're free to use to_json
on anything - String, Array and Hash.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…