У меня есть 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 в качестве источника данных, поэтому даты, похоже, тоже вызывают эту ошибку)
Любой намек в правильном направлении будет оценен.
РЕДАКТИРОВАТЬ:
Спасибо за ответ! Возможно, мне следовало быть более точным.
Я использовал (и проголосовал) ответы здесь, чтобы обойти ограничения setпереводимого, но есть и внутренние ключи, которые также являются проблемой.
Объекты в setявляются сложными объектами, которые преобразуются __dict__, но сами они также могут содержать значения своих свойств, которые могут не подходить для базовых типов в кодировщике json.
В него входит много разных типов set, и хеш в основном вычисляет уникальный идентификатор для сущности, но в истинном духе NoSQL точно не сказано, что содержит дочерний объект.
Один объект может содержать значение даты для starts, тогда как другой может иметь некоторую другую схему, которая не содержит ключей, содержащих «не примитивные» объекты.
Вот почему единственное решение, которое я мог придумать, - это расширение метода JSONEncoderзамены defaultдля включения разных случаев, но я не уверен, как это сделать, и документация неоднозначна. Во вложенных объектах, значение, возвращаемое при defaultпереходе по ключу, или это просто общее включение / отбрасывание, которое смотрит на весь объект? Как этот метод учитывает вложенные значения? Я просмотрел предыдущие вопросы и, похоже, не могу найти лучший подход к кодированию для конкретного случая (что, к сожалению, похоже на то, что мне нужно сделать здесь).
dictс? Я думаю, что вы хотите сделатьlistиз набора только что, а затем передать его кодировщику ... например:encode(list(myset))