У мене є 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
s? Думаю, ви хочете зробити простоlist
з набору, а потім передати його кодеру ... Наприклад:encode(list(myset))