web-dev-qa-db-fra.com

"TypeError: (Integer) n'est pas sérialisable JSON" lors de la sérialisation JSON en Python?

J'essaie d'envoyer un dictionnaire simple à un fichier json à partir de python, mais je continue à recevoir le message "TypeError: 1425 n'est pas sérialisable JSON".

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

Si j'ajoute l'argument par défaut, alors il écrit, mais les valeurs entières sont écrites dans le fichier JSON sous forme de chaînes, ce qui n'est pas souhaitable.

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

J'ai trouvé mon problème. Le problème était que mes entiers étaient en réalité du type numpy.int64 .

217
user1329894

Il semble qu'il soit possible de vider numpy.int64 dans une chaîne json dans Python 3 et que l'équipe python en a déjà une conversation. Plus de détails peuvent être trouvés ici .

Il existe une solution de contournement fournie par Serhiy Storchaka. Cela fonctionne très bien alors je le colle ici:

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

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

Cela a résolu le problème pour moi:

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

Il suffit de convertir les nombres de int64 (de numpy) en int.

Par exemple, si la variable x est un int64:

int(x)

Si est un tableau de int64:

map(int, x)

Vous avez le type de données Numpy, il suffit de passer au type de données normal int () ou float (). cela fonctionnera bien.

Sinon, vous pouvez d'abord convertir votre objet en une image de données:

df = pd.DataFrame(obj)

puis enregistrez cette dataframe dans un fichier json:

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

J'espère que cela t'aides

0
kartik