Comment JSON sérialiser des jeux?

J'ai un Python set qui contient des objets avec __hash__ et __eq__ méthodes afin de s'assurer de l'absence de doublons sont inclus dans la collection.

J'ai besoin de json-encode ce résultat set, mais en passant même vide set à la json.dumps méthode soulè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 le json.JSONEncoder classe qui a une coutume default méthode, mais je ne suis même pas sûr où commencer dans la conversion de plus de la set. Dois-je créer un dictionnaire de la set valeurs au sein de la méthode par défaut, et ensuite de retour à l'encodage sur qui? Idéalement, j'aimerais faire la méthode par défaut en mesure de traiter tous les types de données que l'origine de l'encodeur étouffe (je suis à l'aide de Mongo comme une source de données afin dates semblent soulever cette erreur trop)

Tout soupçon dans la bonne direction serait appréciée.

EDIT:

Merci pour la réponse! Peut-être que j'aurais dû être plus précis.

J'ai utilisé (et upvoted) les réponses ici, afin de contourner les limitations de la set en cours de traduction, mais il y a des clés internes qui sont un problème.

Les objets dans le set sont des objets complexes qui traduisent __dict__, mais ils peuvent également contenir des valeurs de leurs propriétés qui pourraient être éligibles pour les types de base dans le json de l'encodeur.

Il y a beaucoup de différents types de venir sur ce set, et le hachage fondamentalement calcule un identifiant unique pour l'entité, mais dans le véritable esprit de NoSQL, on ne sait pas exactement ce que l'enfant objet contient.

Un objet peut contenir une valeur de date pour starts, tandis qu'un autre peut avoir une autre schéma qui ne comprend pas de clés contenant "non-primitifs" des objets.

C'est pourquoi la seule solution que je pouvais penser était de prolonger la JSONEncoder pour remplacer le default méthode à son tour sur les différents cas - mais je ne suis pas sûr de savoir comment aller à ce sujet, et la documentation est ambigu. Dans les objets imbriqués, la valeur renvoyée par default aller par touche, ou est-il un générique inclure/exclure que regarde l'ensemble de l'objet? Comment est-ce que la méthode d'accueillir imbriquée valeurs? J'ai regardé à travers les questions précédentes et n'arrive pas à trouver la meilleure approche pour le cas spécifique de l'encodage (qui, malheureusement, semble être ce que je vais avoir besoin de faire ici).

  • pourquoi dicts? Je pense que vous voulez simplement faire une list de le définir et de le passer à l'encodeur... e.g: encode(list(myset))
  • Au lieu d'utiliser JSON, vous pouvez utiliser YAML (JSON est essentiellement un sous-ensemble de YAML).
  • Il apporte aucun avantage si? Je ne pense pas que les jeux sont parmi les universellement pris en charge types de données de YAML, et c'est moins largement pris en charge, en particulier concernant l'Api.
  • Je vous remercie pour votre entrée, mais l'application frontend nécessite JSON comme un type de retour, et cette exigence est, à toutes fins fixe.
  • Je suggère YAML, car il a une prise en charge native pour les deux jeux et dates.
  • FWIW, ma réponse montre comment gérer l'étude cas sans casser votre capacité à utiliser les listes et les dicts. Cette approche est facilement étendu pour gérer beaucoup de différents types de données.
  • Je suis dans le processus de mise en œuvre de votre solution à l'heure actuelle. Étrange coïncidence - le système de notation pour ces ensembles de données a été construit avec votre réseau de neurones code comme un guide! Peut-être vous souvenez-vous de moi vous tweet =)