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