"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))
pengguna1329894
sumber
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.

pengguna1329894
sumber
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)
hsc
sumber
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)
    }
Tobias Ernst
sumber
4

Konversi angka dari int64(dari numpy) ke int.

Misalnya, jika variabel xadalah int64:

int(x)

Jika array int64:

map(int, x)
Jonatas Eduardo
sumber
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)
Buggy
sumber
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).

Siwa
sumber
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

kartik
sumber
0

Anda memiliki Tipe Data Numpy, Cukup ubah ke tipe data normal int () atau float (). itu akan bekerja dengan baik.

Sriram Arvind Lakshmanakumar
sumber
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.

pengguna319436
sumber
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()
krishna kumar mishra
sumber