ОБНОВЛЕНИЕ : Даже с Rails 3.2 та же проблема остается нерешенной. Гадкий хак, чтобы принудительно загрузить самоцвет json и перезаписать его, то есть.
В конце концов я получил следующий код, чтобы полностью обойти 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 строк кода делают ваше приложение 50 раз быстрее для кодирования JSON. Вероятно, вы хотите сделать то же самое. :)
У меня была похожая проблема вплоть до Rails 2.3.8.
Проблема в том, что ActiveSupport::JSON.backend = 'JSONGem'
- это недооцененное решение, и вам все равно нужно самостоятельно перезаписать некоторые кодировщики. ( ПРЕДУПРЕЖДЕНИЕ : для Rails 3.x, в котором используется MultiJson, оно должно быть не менее 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
для чего угодно - String, Array и Hash.