Mam Python set
, który zawiera obiekty z __hash__
i __eq__
metod w celu dokonania pewnych duplikatów nie są zawarte w zbiorze.
Muszę zakodować ten wynik w set
formacie json , ale przekazanie nawet pustego elementu set
do json.dumps
metody wywołuje 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
Wiem, że mogę utworzyć rozszerzenie json.JSONEncoder
klasy, która ma niestandardową default
metodę, ale nie jestem nawet pewien, od czego zacząć konwertowanie na set
. Czy powinienem utworzyć słownik z set
wartości w metodzie domyślnej, a następnie zwrócić kodowanie? Idealnie chciałbym, aby domyślna metoda była w stanie obsłużyć wszystkie typy danych, na których dusi oryginalny koder (używam Mongo jako źródła danych, więc daty wydają się również powodować ten błąd)
Każda wskazówka we właściwym kierunku będzie mile widziana.
EDYTOWAĆ:
Dziękuję za odpowiedź! Może powinienem był być bardziej precyzyjny.
Wykorzystałem (i przegłosowałem) odpowiedzi tutaj, aby ominąć ograniczenia set
tłumaczenia, ale istnieją również klucze wewnętrzne, które również stanowią problem.
Obiekty w pliku set
są złożonymi obiektami, które są tłumaczone na __dict__
, ale same mogą również zawierać wartości swoich właściwości, które mogą nie kwalifikować się do podstawowych typów w koderze json.
Wchodzi w to wiele różnych typów set
, a hash w zasadzie oblicza unikalny identyfikator jednostki, ale w prawdziwym duchu NoSQL nie można dokładnie określić, co zawiera obiekt potomny.
Jeden obiekt może zawierać wartość daty dla starts
, podczas gdy inny może mieć inny schemat, który nie zawiera kluczy zawierających obiekty „nieprymitywne”.
Dlatego jedynym rozwiązaniem, jakie przyszło mi do głowy, było rozszerzenie, JSONEncoder
aby zastąpić default
metodę włączania różnych przypadków - ale nie jestem pewien, jak się do tego zabrać, a dokumentacja jest niejednoznaczna. Czy w obiektach zagnieżdżonych wartość zwracana default
przechodzi przez klucz, czy jest to tylko ogólne dołączenie / odrzucenie, które patrzy na cały obiekt? W jaki sposób ta metoda obsługuje zagnieżdżone wartości? Przejrzałem poprzednie pytania i nie mogę znaleźć najlepszego podejścia do kodowania specyficznego dla przypadku (co niestety wydaje się być tym, co będę musiał tutaj zrobić).
dict
? Myślę, że chcesz po prostulist
wyjść z planu, a następnie przekazać to do enkodera ... np:encode(list(myset))