У меня есть 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))