Ich habe einen Python set
, der Objekte mit __hash__
und __eq__
Methoden enthält , um sicherzustellen, dass keine Duplikate in der Sammlung enthalten sind.
Ich muss dieses Ergebnis json codieren set
, aber das Übergeben eines Leerzeichens set
an die json.dumps
Methode löst a aus TypeError
.
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python2.7/json/encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: set([]) is not JSON serializable
Ich weiß, dass ich eine Erweiterung für die json.JSONEncoder
Klasse erstellen kann , die eine benutzerdefinierte default
Methode hat, aber ich bin mir nicht einmal sicher, wo ich mit der Konvertierung über beginnen soll set
. Sollte ich aus den set
Werten der Standardmethode ein Wörterbuch erstellen und dann die Codierung dafür zurückgeben? Im Idealfall möchte ich die Standardmethode in die Lage versetzen, alle Datentypen zu verarbeiten, an denen der ursprüngliche Encoder erstickt (ich verwende Mongo als Datenquelle, sodass Daten diesen Fehler ebenfalls auslösen).
Jeder Hinweis in die richtige Richtung wäre willkommen.
BEARBEITEN:
Danke für die Antwort! Vielleicht hätte ich genauer sein sollen.
Ich habe die Antworten hier verwendet (und positiv bewertet), um die Einschränkungen der set
Übersetzung zu umgehen , aber es gibt auch interne Schlüssel, die ein Problem darstellen.
Die Objekte in set
sind komplexe Objekte, die übersetzt werden __dict__
, aber sie selbst können auch Werte für ihre Eigenschaften enthalten, die für die Basistypen im JSON-Encoder möglicherweise nicht geeignet sind.
Es gibt viele verschiedene Typen set
, und der Hash berechnet im Grunde eine eindeutige ID für die Entität, aber im wahren Geist von NoSQL kann nicht genau gesagt werden, was das untergeordnete Objekt enthält.
Ein Objekt enthält möglicherweise einen Datumswert für starts
, während ein anderes Objekt möglicherweise ein anderes Schema enthält, das keine Schlüssel enthält, die "nicht primitive" Objekte enthalten.
Deshalb ist die einzige Lösung , die ich denken konnte, war das zu erweitern , JSONEncoder
die ersetzen default
Methode auf verschiedene Fälle zu drehen - aber ich bin nicht sicher , wie dies zu realisieren und die Dokumentation ist nicht eindeutig. Wird in verschachtelten Objekten der von default
go zurückgegebene Wert per Schlüssel angegeben, oder handelt es sich nur um ein generisches Einschließen / Verwerfen, das das gesamte Objekt betrachtet? Wie berücksichtigt diese Methode verschachtelte Werte? Ich habe frühere Fragen durchgesehen und kann anscheinend nicht den besten Ansatz für die fallspezifische Codierung finden (was leider so aussieht, wie ich es hier tun muss).
dict
s? Ich denke, Sie möchten nur einlist
Set machen und es dann an den Encoder weitergeben ... zB:encode(list(myset))