У меня есть 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, который смотрит на весь объект? Как этот метод поддерживает вложенные значения? Я просмотрел предыдущие вопросы и не могу найти лучший подход к кодировке, зависящей от конкретного случая (что, к сожалению, похоже на то, что мне нужно будет делать здесь).