2

Rails 2.3.6 开始使用快速的新 json 库,yajl-ruby“如果可用”

在 yajl-ruby 自述文件的“JSON gem Compatibility API”部分中,它概述了一种方法,只需放入 yajl-ruby 包含并让应用程序的其余部分无缝拾取它。

所以,理想情况下,我想

  1. Rails 使用它
  2. 我的宝石使用它
  3. 我的应用程序代码使用它

实现这一目标的最简单方法是什么?我猜:

config.gem 'yajl-ruby', :lib => 'yajl/json_gem'

作为 environment.rb 中的第一个 gem。这样做不会导致任何错误,但我不确定如何知道 rails 是否将其拾取以供自己使用。

谢谢!约翰

4

1 回答 1

8

我建议yajl-ruby直接使用 's API 而不是 JSON gem 兼容性 API,主要是因为 JSON gem 的方法与 JSON gem 的to_json方法冲突ActiveSupport并且长期存在使它们一起工作的问题。

如果您只是这样做config.gem 'yajl-ruby', :lib => 'yajl',则需要使用Yajl::ParserandYajl::Encoder直接解析/编码对象。这样做的好处是您可以确定不会与方法覆盖发生任何冲突,因此可以保证您的 JSON 编码/解析代码将按预期工作。缺点是如果您使用任何使用 JSON gem 的 gem,他们会继续这样做,但您自己的代码将使用 yajl-ruby。

如果您愿意,您可以使用 config.gem 行,然后在初始化程序中require 'yajl',这样您就可以加载两个 API。yajl/json_gem包含将覆盖任何使用 JSON gem 的东西-yajl以确保覆盖这些方法尝试确保require 'yajl/json_gem'最后发生。

如果您使用的是 Rails 3,则可以将其添加到初始化程序中:

ActionController::Renderers.add :json do |json, options|
  json = Yajl.dump(json) unless json.respond_to?(:to_str)
  json = "#{options[:callback]}(#{json})" unless options[:callback].blank?
  self.content_type ||= Mime::JSON
  self.response_body  = json
end

确保render :json => ...通话也能使用yajl-ruby

抱歉,如果这并没有真正回答您的问题,但我想至少给出yajl-ruby直接使用 API 的建议:)

于 2010-06-18T23:52:59.643 回答