Serialisierung der Ausgabe an JSON – ValueError: Kreisreferenz erkannt

Ich versuche, die Ergebnisse meiner MySQL-Abfrage an JSON auszugeben. Ich habe Probleme mit der Serialisierung datetime.datetime Feld, also habe ich kleine Funktion geschrieben, um das zu tun:

def date_handler(obj): if hasattr(obj, 'isoformat'): return obj.isoformat() else: return obj 

Und dann im Hauptcode bin ich gerade laufen:

 products_json = [] for code in best_matching_codes: cur = db.cursor() query = "SELECT * FROM %s WHERE code LIKE '%s'" % (PRODUCTS_TABLE_NAME, product_code) cur.execute(query) columns = [desc[0] for desc in cur.description] rows = cur.fetchall() for row in rows: products_json.append(dict((k,v) for k,v in zip(columns,row))) return json.dumps(products_json, default = date_handler) 

Allerdings, da ich schrieb date_handler Funktion, bekomme ich "ValueError: Circular Reference erkannt"

 127.0.0.1 - - [10/Jan/2013 00:42:18] "GET /1/product?code=9571%2F702 HTTP/1.1" 500 - Traceback (most recent call last): File "/Library/Python/2.7/site-packages/flask/app.py", line 1701, in __call__ return self.wsgi_app(environ, start_response) File "/Library/Python/2.7/site-packages/flask/app.py", line 1689, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/Library/Python/2.7/site-packages/flask/app.py", line 1687, in wsgi_app response = self.full_dispatch_request() File "/Library/Python/2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request rv = self.handle_user_exception(e) File "/Library/Python/2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request rv = self.dispatch_request() File "/Library/Python/2.7/site-packages/flask/app.py", line 1344, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/Users/pisarzp/Desktop/SusyChoosy/susyAPI/test1.py", line 69, in product_search return json.dumps(products_json, default = date_handler) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 238, in dumps **kw).encode(obj) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode chunks = self.iterencode(o, _one_shot=True) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode return _iterencode(o, 0) ValueError: Circular reference detected 

Was habe ich brechen Gibt es einen besseren Weg, um die Ausgabe an JSON zu serialisieren?

3 Solutions collect form web for “Serialisierung der Ausgabe an JSON – ValueError: Kreisreferenz erkannt”

Die Funktion, die Sie als default , wird nur für Objekte aufgerufen, die vom json Modul nicht nativ serialisierbar sind. Es muss ein serialisierbares Objekt zurückgeben oder einen TypeError anheben.

Ihre Version gibt das gleiche Objekt zurück, das Sie bestanden haben, wenn es nicht von dem einen Typ ist, den Sie festlegen (Datum). Das verursacht den kreisförmigen Referenzfehler (was irreführend ist, da der Kreis zwischen einem Objekt und sich selbst ist, nachdem er von date_handler verarbeitet wurde).

Sie können beginnen, dies zu beheben, indem Sie date_handler ändern, um eine Ausnahme in seinem else Block zu erhöhen. Das wird wohl noch scheitern, aber man kann wohl dann herausfinden, welches Objekt es in deiner Datenstruktur ist, was das Problem mit dem Code wie folgt verursacht:

 def date_handler(obj): if hasattr(obj, 'isoformat'): return obj.isoformat() else: raise TypeError( "Unserializable object {} of type {}".format(obj, type(obj)) ) 

Anstatt den TypError selbst zu heben, solltest du den Anruf an die Standardmethode von JSONEncoder weiterleiten:

 def date_handler(obj): if hasattr(obj, 'isoformat'): return obj.isoformat() else: json.JSONEncoder.default(self,obj) 

Dies wird auch TypeError erhöhen und ist eine bessere Praxis, ermöglicht es JSONEncoder zu versuchen und kodieren die Art, die Ihre Methode nicht kann.

 json.dumps(obj,default = method_name) 

method_name Funktion muss ein Serialis-Objekt zurückgeben.

 def method_name(obj): data = {'__class__':obj.__class__.__name__, '__module__':obj.__module__ } data.update(obj.__dict__) return data`#data is dict object in this case 
  • Subtrahieren zwischen verschiedenen Datetypwerten in Python
  • Wer kann ich den Fall in Python ändern machen oberen unteren und umgekehrt python
  • Nur Längen-1-Arrays können in Python-Skalare mit Log umgewandelt werden
  • Wie bekomme ich nur arabische Texte aus einer Zeichenkette mit regulärem Ausdruck?
  • Python 2.7.5 - Wo ist es auf Windows Vista installiert? [abgeschlossen]
  • Url decodiert UTF-8 in Python
  • Ich bekomme Fehler [socket.gaierror: [Errno 11004] getaddrinfo fehlgeschlagen]
  • Python 'wenn x ist Keine' nicht fangen keineType
  • Wie kann ich schnell zwischen den verschiedenen Python-ausführbaren Dateien auf meinem Mac wechseln?
  • Wie man Argumente übergibt, wenn Aufträge parallel zu einer freigegebenen Job-Warteschlange mit python-Zeitplan-Modul ausgeführt werden
  • Entwerfen Sie eine Python-API für vorhandene Java-API
  • Python ist die beste Programmiersprache der Welt.