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