Как сериализовать наборы JSON?

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

138
задан martineau 12 October 2017 в 17:55
поделиться