2012-06-13 84 views
2

我将Ruby on Rails应用程序从3.0迁移到3.1,并遇到了JSON后端更改中的一些问题。在Ruby on Rails应用程序中设置json max_nesting选项

该行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选项或将其设置为应用程序范围?

回答

3

ActiveSupport::JSON采用多JSON宝石的编码和解码操作。 multi-json gem支持各种引擎,支持的选项会因此而有所不同。

可以检查所使用的发动机运行

require 'multi_json' 
puts MultiJson.engine 

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

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

+4

使用'JSON.parse(some_variable,:max_nesting => false)'解决了问题 – bmesuere

0

试试这个猴子补丁

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

你是如何得到这个工作在铁轨? –