2016-07-20 14 views
0

Ich versuche, ein verschachteltes zyklisches Wörterbuch in JSON zu konvertieren. Ich erhalte einen Überlauffehler:Python: Zyklisches Wörterbuch in JSON konvertieren

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 

Nicht sicher, warum dies geschieht, aber meine Vermutung ist, dass es etwas mit meinem Wörterbuch zu tun, und wie es strukturiert.

+1

Wie haben Sie das * verschachtelte zyklische Wörterbuch * bekommen? –

+0

Hmm, ich bekomme einen 'ValueError' mit einem zyklischen Dictionary. – Alex

Antwort

0

Der Json-Decoder von Python verfügt über eine Funktion zur Überprüfung auf zyklische Objekte - check_circular - die standardmäßig auf True gesetzt ist. Sein Verhalten ist genau, um den Overflowerro zu erhöhen, den Sie sehen.

(In Python 3.5 Ich erhalte eine ValueError mit check_circular aktiviert und ein RecursionError damit deaktiviert) Jetzt

, es auf False festlegen sicherlich Dinge nicht beheben, da nach wie vor eine JSON Darstellung einer zyklischen Datenstruktur würde sei unendlich.

Die einzige Möglichkeit besteht darin, einen benutzerdefinierten JSON-Encoder und DECODER zu erstellen und ein Schema für Ihren eigenen Decoder zu entwickeln, um eine zyklische Referenz wiederherstellen zu können.

0

Wie ein zyklisches Wörterbuch machen, ich kürzestes Beispiel denken kann:

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

Die Frage ist also, was Ihre Frage ist. Trotz der Tatsache, dass Python (mindestens 2,7, jedenfalls) den zyklischen Verweis erlaubt, was willst du damit machen? Möchten Sie wirklich, dass die JSON-Daten einen Zyklus unterstützen können? Es scheint unpraktisch zu sein, einen eigenen Encoder und Decoder zu erstellen - dann ist es nicht wirklich JSON, es sind keine Daten, die man generisch als JSON an andere weitergeben kann, ein Decoder, der auf Standards geschrieben ist, wäre nicht in der Lage, es richtig zu dekodieren.

Es scheint viel sinnvoller zu sein, die Zyklen zu finden und zu eliminieren, oder irgendwie selbst zu referenzieren, ohne tatsächlich selbst im Wörterbuch zu referenzieren, vielleicht eine Art Referenzklasse zu erstellen, die das Element im Wörterbuch finden kann Suche nach einer Liste von Schlüsseln und Indizes (für Listen) anstatt direkt auf das Objekt zu verweisen?

Und dann führen Sie es durch einen Standard-Encoder.