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 setan die json.dumpsMethode 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.JSONEncoderKlasse erstellen kann , die eine benutzerdefinierte defaultMethode hat, aber ich bin mir nicht einmal sicher, wo ich mit der Konvertierung über beginnen soll set. Sollte ich aus den setWerten 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 setsind 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 , JSONEncoderdie ersetzen defaultMethode 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 defaultgo 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).
dicts? Ich denke, Sie möchten nur einlistSet machen und es dann an den Encoder weitergeben ... zB:encode(list(myset))