【问题标题】:Python: Convert Cyclical dictionary to JSONPython:将循环字典转换为 JSON
【发布时间】:2016-07-20 20:14:57
【问题描述】:

我正在尝试将嵌套循环字典转换为 JSON。我收到溢出错误:

In [8]: xx = json.dumps(d)
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-8-95e57b3e2ca3> in <module>()
----> 1 xx = json.dumps(d)

OverflowError: Maximum recursion level reached

不知道为什么会发生这种情况,但我猜测它与我的字典以及它的结构有关。

【问题讨论】:

  • 你是如何得到嵌套循环字典的?
  • 嗯,我得到了一个带有循环字典的ValueError

标签: python json dictionary circular-dependency


【解决方案1】:

Python 的 json 解码器确实具有检查循环对象的功能 - check_circular - 默认为 True。它的行为正是为了提升你所看到的溢出。

(在 Python 3.5 中,我得到一个启用 check_circularValueError 和一个禁用它的 RecursionError

现在,将其设置为 False 肯定不会解决问题,因为循环数据结构的 JSON 表示仍然是无限的。

唯一的方法是创建自定义 JSON 编码器和解码器,并为您自己的解码器设计一个架构,以便能够恢复任何循环引用。

【讨论】:

    【解决方案2】:

    如何制作循环词典,我能想到的最短例子:

    >>> foo = { 'bar': None }
    >>> foo['bar'] = foo
    >>> foo
    {'bar': {...}}
    >>> foo['bar']
    {'bar': {...}}
    >>> foo['bar']['bar']
    {'bar': {...}}
    

    所以问题是你的问题是什么。尽管 Python(至少 2.7,无论如何)允许循环引用,你想用它做什么?您真的希望 JSON 数据能够支持循环吗?创建自己的编码器和解码器似乎是不切实际的——那么它就不是真正的 JSON,也不是你可以作为 JSON 传递给其他人的数据,按照标准编写的解码器将无法正确解码。

    找到并消除循环似乎更有意义,或者以某种方式自我引用而不在字典中实际自我引用,也许创建某种引用类,也许可以在字典中找到您正在查找的项目使用键和索引列表(用于列表)而不是直接引用对象?

    然后通过标准编码器运行它。

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 2011-01-29
      • 2014-02-26
      • 2018-05-04
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多