J'ai un Python set
qui contient des objets avec __hash__
et des __eq__
méthodes afin de m'assurer qu'aucun doublon n'est inclus dans la collection.
J'ai besoin de json encoder ce résultat set
, mais passer même un vide set
à la json.dumps
méthode lève un 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
Je sais que je peux créer une extension pour la json.JSONEncoder
classe qui a une default
méthode personnalisée , mais je ne sais même pas par où commencer la conversion via le set
. Dois-je créer un dictionnaire à partir des set
valeurs de la méthode par défaut, puis renvoyer l'encodage à ce sujet? Idéalement, j'aimerais que la méthode par défaut soit capable de gérer tous les types de données sur lesquels l'encodeur d'origine s'étouffe (j'utilise Mongo comme source de données, donc les dates semblent également soulever cette erreur)
Tout indice dans la bonne direction serait apprécié.
ÉDITER:
Merci d'avoir répondu! J'aurais peut-être dû être plus précis.
J'ai utilisé (et voté) les réponses ici pour contourner les limites de la set
traduction, mais il y a aussi des clés internes qui posent un problème.
Les objets dans le set
sont des objets complexes qui se traduisent en __dict__
, mais ils peuvent également contenir des valeurs pour leurs propriétés qui pourraient ne pas être éligibles pour les types de base dans l'encodeur json.
Il y a beaucoup de types différents qui entrent en jeu set
, et le hachage calcule essentiellement un identifiant unique pour l'entité, mais dans le véritable esprit de NoSQL, il est impossible de dire exactement ce que contient l'objet enfant.
Un objet peut contenir une valeur de date pour starts
, tandis qu'un autre peut avoir un autre schéma qui n'inclut aucune clé contenant des objets "non primitifs".
C'est pourquoi la seule solution à laquelle je pouvais penser était d'étendre le JSONEncoder
pour remplacer la default
méthode pour activer différents cas - mais je ne sais pas comment s'y prendre et la documentation est ambiguë. Dans les objets imbriqués, la valeur renvoyée par default
passe-t-elle par clé, ou s'agit-il simplement d'une inclusion / suppression générique qui regarde l'objet entier? Comment cette méthode prend-elle en charge les valeurs imbriquées? J'ai parcouru les questions précédentes et je n'arrive pas à trouver la meilleure approche pour l'encodage spécifique au cas (ce qui semble malheureusement être ce que je vais devoir faire ici).
dict
s? Je pense que vous voulez juste faire unlist
hors de l'ensemble et ensuite le passer à l'encodeur ... par exemple:encode(list(myset))