it-swarm.com.de

"TypeError: (Integer) ist nicht in JSON serialisierbar", wenn JSON in Python serialisiert wird?

Ich versuche, ein einfaches Wörterbuch aus Python an eine Json-Datei zu senden, erhalte aber weiterhin die Meldung "TypeError: 1425 ist nicht JSON serialisierbar".

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

Wenn ich das Standardargument hinzufüge, schreibt es, aber die ganzzahligen Werte werden als Strings in die Json-Datei geschrieben, was unerwünscht ist.

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

Ich habe mein Problem gefunden. Das Problem war, dass meine Ganzzahlen tatsächlich numpy.int64 waren.

217
user1329894

In Python 3 scheint es ein Problem zu sein, numpy.int64 in json string auszulesen, und das Python-Team hat bereits ein Gespräch darüber. Weitere Details finden Sie hier .

Es gibt eine Problemumgehung von Serhiy Storchaka. Es funktioniert sehr gut, ich füge es hier ein:

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

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

Dies löste das Problem für mich:

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

Konvertieren Sie einfach Zahlen von int64 (von numpy) in int.

Wenn zum Beispiel die Variable x ein int64 ist:

int(x)

Wenn ist Array von int64:

map(int, x)

Sie haben Numpy-Datentyp. Wechseln Sie einfach zum normalen Datentyp int () oder float (). es wird gut funktionieren.

Alternativ können Sie Ihr Objekt zuerst in einen Datenrahmen konvertieren:

df = pd.DataFrame(obj)

und speichern Sie diese dataframe in einer json-Datei:

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

Hoffe das hilft

0
kartik