J'ai un Python setqui 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.dumpsmé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.JSONEncoderclasse qui a une defaultmé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 setvaleurs 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 settraduction, mais il y a aussi des clés internes qui posent un problème.
Les objets dans le setsont 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 JSONEncoderpour remplacer la defaultmé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 defaultpasse-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).
dicts? Je pense que vous voulez juste faire unlisthors de l'ensemble et ensuite le passer à l'encodeur ... par exemple:encode(list(myset))