"TypeError: (Integer) bukan JSON serializable" saat membuat serialisasi JSON dengan Python?


162

Saya mencoba mengirim kamus sederhana ke file json dari python, tapi saya tetap mendapatkan pesan "TypeError: 1425 bukan 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()

Jika saya menambahkan argumen default, maka ia menulis, tetapi nilai integer ditulis ke file json sebagai string, yang tidak diinginkan.

afile.write(json.dumps(alerts,encoding='UTF-8',default=str))


1
Tampaknya ini tidak "menggandakan" pertanyaan itu ..

8
Saya menemukan masalah saya. Masalahnya adalah bahwa bilangan bulat saya sebenarnya ketik numpy.int64.
user1329894

@ user1329894 Posting sebagai solusi / penjelasan dan swa-tutup ..

-0 untuk menulis repro minimal yang sebenarnya tidak mereproduksi bug.
Russell Borogove

Jawaban:


268

Saya menemukan masalah saya. Masalahnya adalah bahwa bilangan bulat saya sebenarnya tipe numpy.int64.


22
Saya harus berurusan dengan masalah ini juga, dan jawaban Anda menunjuk saya ke arah yang benar. Saya hanya ingin menambahkan tautan ke pertanyaan lain yang dapat membantu menyelesaikan masalah sebenarnya.
JAC

19
Itu akan lebih baik jika pesan kesalahan JSON unserializable dapat menampilkan jenis objek ...
Franck Dernoncourt

6
Berikut ini adalah solusi rapi yang menggunakan serializer khusus.
Owen

17
Itu masalahnya, tapi apa solusinya?
BallpointBen

5
x.astype (int) atau int (x)
zelcon

50

Sepertinya mungkin ada masalah untuk membuang numpy.int64 ke string json di Python 3 dan tim python sudah memiliki percakapan tentang hal itu. Rincian lebih lanjut dapat ditemukan di sini .

Ada solusi yang disediakan oleh Serhiy Storchaka. Ini bekerja sangat baik jadi saya tempel di sini:

def convert(o):
    if isinstance(o, numpy.int64): return int(o)  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

Solusi luar biasa yang disediakan oleh Serhiy. Silakan periksa pendekatannya. Dan untuk menambahkan, cukup: json.dumps (yourObject, default = default); seperti di sini.
Pranzell

4

Ini memecahkan masalah bagi saya:

def serialize(self):
    return {
        my_int: int(self.my_int), 
        my_float: float(self.my_float)
    }

4

Konversi angka dari int64(dari numpy) ke int.

Misalnya, jika variabel xadalah int64:

int(x)

Jika array int64:

map(int, x)

3

seperti @JAC tunjukkan dalam komentar dari jawaban berperingkat tertinggi, solusi umum (untuk semua tipe numpy) dapat ditemukan di utas Mengkonversi dtypes numpy ke tipe python asli .

Namun demikian, saya akan menambahkan versi solusi saya di bawah ini, karena dalam kasus saya, saya memerlukan solusi umum yang menggabungkan jawaban ini dan dengan jawaban dari utas lainnya. Ini harus bekerja dengan hampir semua tipe numpy.

def convert(o):
    if isinstance(o, np.generic): return o.item()  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

Jawaban yang bagus memang
jtlz2

2

Ini mungkin respons yang terlambat, tetapi baru-baru ini saya mendapat kesalahan yang sama. Setelah banyak berselancar, solusi ini membantu saya.

alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
def myconverter(obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, datetime.datetime):
            return obj.__str__()

Panggil seperti myconverterdi json.dumps()bawah ini.json.dumps(alerts, default=myconverter).


1

Atau Anda dapat mengkonversi objek Anda menjadi bingkai data terlebih dahulu:

df = pd.DataFrame(obj)

dan kemudian simpan ini dataframedalam jsonfile:

df.to_json(path_or_buf='df.json')

Semoga ini membantu



0

Permasalahan yang sama. Daftar nomor berisi tipe numpy.int64 yang melempar TypeError. Solusi cepat bagi saya adalah untuk

mylist = eval(str(mylist_of_integers))
json.dumps({'mylist': mylist})

yang mengubah list menjadi fungsi str () dan eval () mengevaluasi "String" seperti ekspresi python dan mengembalikan hasilnya sebagai daftar integer dalam kasus saya.


Hanya melihat eval (str ()) sangat lambat jadi gunakan dengan hati-hati. @ shiva jawaban jauh lebih baik: json.dumps (peringatan, default = myconverter)
user319436

0

menggunakan

from numpyencoder import NumpyEncoder

untuk mengatasi masalah ini di Python3:

import json
from numpyencoder import NumpyEncoder
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',cls=NumpyEncoder))
afile.close()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.