Python'da JSON serileştirilirken “TypeError: (Integer) JSON serileştirilemez”?


162

Python bir json dosyasına basit bir sözlük göndermeye çalışıyorum, ancak "TypeError: 1425 JSON serileştirilebilir değil" iletisi alıyorum.

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()

Varsayılan bağımsız değişkeni eklerseniz, o zaman yazar, ancak tamsayı değerleri json dosyasına dizeler olarak yazılır, bu istenmeyen bir durumdur.

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


1
Bu, bu soruyu "yinelemek" gibi görünmüyor ..

8
Sorunumu buldum. Sorun tam sayılarımın aslında numpy.int64 türüydü.
user1329894

@ user1329894 Mesaj bir çözüm / açıklama olarak ve kendi kendine kapanış ..

-0 Gerçekten hata üretmeyen minimal bir repro yazmak için.
Russell Borogove

Yanıtlar:


268

Sorunumu buldum. Sorun, tamsayılarımın aslında tür olmasıydı numpy.int64.


22
Ben de bu konuyla uğraşmak zorunda kaldım ve cevabınız bana doğru yönü gösterdi. Sadece problemi çözmede yardımcı olabilecek başka bir soruya bağlantı eklemek istedim .
JAC

19
JSON unerializable hata mesajı nesnenin türünü görüntüleyebilirse iyi olurdu ...
Franck Dernoncourt

6
İşte özel bir serileştirici kullanan düzenli bir çözüm.
Owen

17
Sorun bu, ama çözüm ne?
BallpointBen

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

50

Python 3'te numpy.int64'ü json dizesine dökmek için bir sorun olabilir ve python ekibi zaten bu konuda bir konuşma yapıyor. Daha fazla ayrıntıyı burada bulabilirsiniz .

Serhiy Storchaka tarafından sağlanan bir geçici çözüm var. Çok iyi çalışıyor, bu yüzden buraya yapıştırıyorum:

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

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

Serhiy tarafından sağlanan harika bir geçici çözüm. Lütfen yaklaşımını kontrol edin. Ve eklemek için: json.dumps (yourObject, default = default); Burası gibi.
Pranzell

4

Bu benim için problemi çözdü:

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

4

Sadece sayıları int64(numpy'dan) 'e dönüştürün int.

Örneğin, değişken xbir int64 ise:

int(x)

İnt64 dizisi ise:

map(int, x)

3

@JAC, en yüksek puanlı cevabın yorumlarında belirtildiği gibi, genel çözüm (tüm numpy türleri için) Numpy dtypes'lerini doğal python türlerine dönüştürme iş parçacığında bulunabilir .

Yine de, benim durumumda bu cevapları ve diğer iş parçacığının cevaplarını birleştiren genel bir çözüme ihtiyaç duyduğum için, aşağıdaki çözümün versiyonunu ekleyeceğim. Bu hemen hemen tüm numpy türleri ile çalışmalıdır.

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

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

Güzel cevap gerçekten
jtlz2

2

Bu geç yanıt olabilir, ama son zamanlarda aynı hatayı aldım. Birçok sörften sonra bu çözüm bana yardımcı oldu.

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__()

Çağrı myconverteriçinde json.dumps()aşağıda gibi.json.dumps(alerts, default=myconverter).


1

Alternatif olarak, önce nesnenizi bir veri çerçevesine dönüştürebilirsiniz:

df = pd.DataFrame(obj)

ve bunu dataframebir jsondosyaya kaydedin :

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

Bu yardımcı olur umarım



0

Aynı sorun. Liste, bir TypeError hatası atan numpy.int64 türünde sayılar içeriyordu. Benim için hızlı bir çözüm

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

Bu, listeyi str () ve eval () işlevine dönüştürür, “String” i bir python ifadesi gibi değerlendirir ve sonucu benim durumumda bir tamsayı listesi olarak döndürür.


Sadece eval (str ()) çok yavaş fark dikkatle kullanın. @ shiva'nın cevabı çok daha iyi: json.dumps (uyarılar, varsayılan = çevirici)
user319436

0

kullanım

from numpyencoder import NumpyEncoder

Python3 bu sorunu çözmek için:

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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.