Próbuję wysłać prosty słownik do pliku json z języka Python, ale wciąż otrzymuję komunikat „TypeError: 1425 is not JSON serializable”.
import json
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8'))
afile.close()
Jeśli dodam domyślny argument, to zapisuje, ale wartości całkowite są zapisywane w pliku json jako ciągi znaków, co jest niepożądane.
afile.write(json.dumps(alerts,encoding='UTF-8',default=str))
Odpowiedzi:
Znalazłem swój problem. Problem polegał na tym, że moje liczby całkowite były w rzeczywistości typem
numpy.int64
.źródło
Wygląda na to, że może wystąpić problem z wrzuceniem numpy.int64 do łańcucha json w Pythonie 3 i zespół pythona już o tym rozmawia. Więcej szczegółów można znaleźć tutaj .
Istnieje obejście dostarczone przez Serhiya Storchakę. Działa bardzo dobrze, więc wklejam go tutaj:
źródło
To rozwiązało problem dla mnie:
źródło
Po prostu przekonwertuj liczby z
int64
(z numpy) naint
.Na przykład, jeśli zmienna
x
to int64:Jeśli jest tablicą int64:
źródło
jak @JAC zauważył w komentarzach do najwyżej ocenionych odpowiedzi, ogólne rozwiązanie (dla wszystkich typów numpy) można znaleźć w wątku Konwersja numpy dtypes na natywne typy Pythona .
Niemniej jednak dodam poniżej moją wersję rozwiązania, ponieważ w moim przypadku potrzebowałem ogólnego rozwiązania, które łączy te odpowiedzi z odpowiedziami z drugiego wątku. To powinno działać z prawie wszystkimi typami numpy.
źródło
To może być późna odpowiedź, ale ostatnio dostałem ten sam błąd. Po długim surfowaniu pomogło mi to rozwiązanie.
Zadzwoń
myconverter
wjson.dumps()
jak poniżej.json.dumps(alerts, default=myconverter).
źródło
Alternatywnie możesz najpierw przekształcić swój obiekt w ramkę danych:
a następnie zapisz to
dataframe
wjson
pliku:Mam nadzieję że to pomoże
źródło
Masz Numpy Typ danych, po prostu zmień typ danych na normalny int () lub float (). będzie działać dobrze.
źródło
Taki sam problem. Lista zawiera liczby typu numpy.int64, które generują błąd TypeError. Szybkim rozwiązaniem było dla mnie
która konwertuje listę na str () i funkcję eval () oblicza „String” jak wyrażenie w Pythonie i zwraca wynik jako listę liczb całkowitych w moim przypadku.
źródło
posługiwać się
aby rozwiązać ten problem w Python3:
źródło