【问题标题】:set json max_nesting option from within Ruby on Rails application在 Ruby on Rails 应用程序中设置 json max_nesting 选项
【发布时间】:2012-06-13 19:30:47
【问题描述】:

我正在将 Ruby on Rails 应用程序从 3.0 迁移到 3.1,但在更改 JSON 后端时遇到了一些问题。

ActiveSupport::JSON.decode(some_variable) 行给了我 MultiJson::DecodeError nesting of 20 is too deep。 我试图解码的变量确实嵌套很重(最多 29 级)。

应该可以使用:max_nesting 选项 ('Nesting too deep' error while retrieving JSON using HTTParty) 更改最大嵌套级别,但这似乎不起作用。

ActiveSupport::JSON.decode(some_variable, :max_nesting => false)ActiveSupport::JSON.decode(some_variable, :max_nesting => 100) 都会导致相同的错误。

有没有办法传递max_nesting 选项或将其设置为应用程序范围?

【问题讨论】:

    标签: ruby-on-rails ruby json


    【解决方案1】:

    ActiveSupport::JSON 使用 multi-json gem 进行编码和解码操作。 multi-json gem 支持多种引擎,支持的选项会有所不同。

    您可以通过运行检查您正在使用的引擎

    require 'multi_json'
    puts MultiJson.engine
    

    我的是MultiJson::Adapters::Yajl,但其他选项也是可能的。 Multi-json 似乎不会以相同的方式将选项传递给每个引擎,所以我建议直接使用 JSON-gem。

    如果您使用的是 json-gem,您可以跳过 ActiveSupport 链并使用 JSON.parse 解析您的数据,您可以直接将 :max_nesting 选项传递给它。

    【讨论】:

    • 使用JSON.parse(some_variable, :max_nesting => false) 解决了问题
    【解决方案2】:

    试试这个猴子补丁

    module JSON
      class << self
        def parse(source, opts = {})
          opts = ({:max_nesting => 100}).merge(opts)
          Parser.new(source, opts).parse
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2011-05-15
      相关资源
      最近更新 更多