当前位置:  开发笔记 > 后端 > 正文

你如何处理ActiveSupport :: JSON和JSON gem之间的冲突?

如何解决《你如何处理ActiveSupport::JSON和JSONgem之间的冲突?》经验,为你挑选了1个好方法。

我很难过这个问题.

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或更高版本,修复它.



1> kenn..:

更新:即使使用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.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有