2

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

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

最大嵌套级别应该可以通过:max_nesting选项(使用 HTTParty 检索 JSON 时出现“嵌套太深”错误)进行更改,但这似乎不起作用。

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

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

4

2 回答 2

3

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

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

require 'multi_json'
puts MultiJson.engine

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

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

于 2012-06-13T11:22:33.487 回答
0

试试这个猴子补丁

module JSON
  class << self
    def parse(source, opts = {})
      opts = ({:max_nesting => 100}).merge(opts)
      Parser.new(source, opts).parse
    end
  end
end
于 2012-06-13T10:57:26.673 回答