L’erreur « TypeError: Object of type ‘int64’ is not JSON serializable » survient fréquemment lors de l’utilisation de bibliothèques comme Pandas et NumPy en Python. Cela se produit parce que JSON ne supporte pas nativement le type de données NumPy `int64`. Ce guide présente des solutions pour résoudre ce problème.
Table des matières
- Conversion de ‘int64’ en types Python standard
- Gestion des grands nombres
- Conversion de ‘int64’ en chaînes de caractères
- Bonnes pratiques pour la sérialisation des données
Conversion de ‘int64’ en types Python standard
La solution la plus courante et souvent préférée consiste à convertir les valeurs `int64` en entiers Python standard (`int`) ou en nombres à virgule flottante (`float`). Cela préserve les données numériques tout en assurant la compatibilité JSON.
Exemple Pandas :
import pandas as pd
import json
data = {'col1': [1, 2, 3, 4, 5, 2**63]} # Inclut un grand nombre
df = pd.DataFrame(data)
# Conversion en int (provoquera une OverflowError pour les grands nombres)
try:
df['col1'] = df['col1'].astype(int)
json_data = json.dumps(df.to_dict('records'))
print(f"Conversion en entier : {json_data}")
except OverflowError:
print("OverflowError survenue lors de la conversion en entier.")
# Conversion en float (gère les grands nombres)
df['col1'] = df['col1'].astype(float)
json_data = json.dumps(df.to_dict('records'))
print(f"Conversion en float : {json_data}")
Exemple NumPy :
import numpy as np
import json
arr = np.array([1, 2, 3, 4, 5, 2**63], dtype=np.int64)
# Conversion en int (provoquera une OverflowError pour les grands nombres)
try:
arr = arr.astype(int)
json_data = json.dumps(arr.tolist())
print(f"Conversion en entier : {json_data}")
except OverflowError:
print("OverflowError survenue lors de la conversion en entier.")
# Conversion en float (gère les grands nombres)
arr = arr.astype(float)
json_data = json.dumps(arr.tolist())
print(f"Conversion en float : {json_data}")
Gestion des grands nombres
Si vos valeurs `int64` peuvent dépasser la valeur maximale représentable par un entier Python standard, la conversion en `float` est essentielle pour éviter `OverflowError`. Les nombres à virgule flottante peuvent gérer une gamme de valeurs numériques beaucoup plus large.
Conversion de ‘int64’ en chaînes de caractères
La conversion en chaînes de caractères est une alternative simple si vous n’avez pas besoin d’effectuer des opérations mathématiques sur les données après la sérialisation. Il s’agit d’une approche robuste qui évite les problèmes potentiels de dépassement de capacité.
import pandas as pd
import json
data = {'col1': [1, 2, 3, 4, 5, 2**63]}
df = pd.DataFrame(data)
df['col1'] = df['col1'].astype(str)
json_data = json.dumps(df.to_dict('records'))
print(json_data)
Bonnes pratiques pour la sérialisation des données
Pour un code plus propre et une maintenance plus facile, gérez systématiquement les types de données avant la sérialisation. Envisagez d’utiliser une bibliothèque de sérialisation dédiée si vos structures de données sont complexes. Choisissez toujours avec soin la méthode de conversion appropriée (int, float ou chaîne de caractères) en fonction des exigences de votre application spécifique.