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-jsongemを使用します。multi-json gemはさまざまなエンジンをサポートしており、サポートされるオプションはそれらの間で異なります。

実行することで、使用しているエンジンを確認できます

require 'multi_json'
puts MultiJson.engine

私のものでしMultiJson::Adapters::Yajlたが、他のオプションも可能です。Multi-jsonは同じ方法で各エンジンにオプションを渡すようには見えないので、JSON-gemを直接使用することをお勧めします。

json-gemを使用している場合は、ActiveSupportチェーンをスキップし、オプションを直接渡すことができる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 に答える