У меня есть Python set, который содержит объекты с методами __hash__ и __eq__, чтобы не включать в коллекцию определенные дубликаты.
Мне нужно json закодировать этот результат set, но передача даже пустого метода set в json.dumps вызывает 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
Я знаю, что могу создать расширение класса json.JSONEncoder, у которого есть собственный метод default, но я даже не уверен, с чего начать преобразование по set. Должен ли я создавать словарь из значений set в методе по умолчанию, а затем возвращать кодировку? В идеале, я бы хотел, чтобы метод по умолчанию мог обрабатывать все типы данных, которые заглушает исходный кодер (я использую Mongo в качестве источника данных, поэтому даты, похоже, тоже повышают эту ошибку)
Было бы понятно любой намек в правильном направлении.
EDIT:
Спасибо за ответ! Возможно, я должен был быть более точным.
Я использовал (и подтвердил) ответы здесь, чтобы обойти ограничения перевода set, но есть и внутренние ключи, которые также являются проблемой.
Объекты в set являются сложными объектами, которые преобразуются в __dict__, но сами они также могут содержать значения для своих свойств, которые могут быть непригодны для основных типов в кодировщике json.
В этот set существует много разных типов, и хэш в основном вычисляет уникальный идентификатор для сущности, но в истинном духе NoSQL не сообщается точно, что содержит дочерний объект.
Один объект может содержать значение даты для starts, тогда как другое может иметь другую схему, которая не содержит ключей, содержащих "непримитивные" объекты.
Вот почему единственным решением, которое я мог подумать, было расширение JSONEncoder, чтобы заменить метод default, чтобы включить разные случаи, но я не уверен, как это сделать, а документация неоднозначна. Во вложенных объектах значение, возвращаемое из default, идет по ключу, или это просто общий include/discard, который смотрит на весь объект? Как этот метод поддерживает вложенные значения? Я просмотрел предыдущие вопросы и не могу найти лучший подход к кодировке, зависящей от конкретного случая (что, к сожалению, похоже на то, что мне нужно будет делать здесь).
