El error «TypeError: Object of type ‘int64’ is not JSON serializable» surge frecuentemente al trabajar con librerías como Pandas y NumPy en Python. Esto ocurre porque JSON no soporta inherentemente el tipo de dato `int64` de NumPy. Esta guía presenta soluciones para resolver este problema.
Tabla de Contenidos
- Convirtiendo ‘int64’ a Tipos Estándar de Python
- Manejo de Números Potencialmente Grandes
- Convirtiendo ‘int64’ a Cadenas
- Mejores Prácticas para la Serialización de Datos
Convirtiendo ‘int64’ a Tipos Estándar de Python
La solución más común y a menudo preferida es convertir los valores `int64` a enteros estándar de Python (`int`) o números de punto flotante (`float`). Esto preserva los datos numéricos mientras se asegura la compatibilidad con JSON.
Ejemplo con Pandas:
import pandas as pd
import json
data = {'col1': [1, 2, 3, 4, 5, 2**63]} # Incluye un número grande
df = pd.DataFrame(data)
# Convertir a int (causará OverflowError para números grandes)
try:
df['col1'] = df['col1'].astype(int)
json_data = json.dumps(df.to_dict('records'))
print(f"Conversión a entero: {json_data}")
except OverflowError:
print("Ocurrió un OverflowError durante la conversión a entero.")
# Convertir a float (maneja números grandes)
df['col1'] = df['col1'].astype(float)
json_data = json.dumps(df.to_dict('records'))
print(f"Conversión a flotante: {json_data}")
Ejemplo con NumPy:
import numpy as np
import json
arr = np.array([1, 2, 3, 4, 5, 2**63], dtype=np.int64)
# Convertir a int (causará OverflowError para números grandes)
try:
arr = arr.astype(int)
json_data = json.dumps(arr.tolist())
print(f"Conversión a entero: {json_data}")
except OverflowError:
print("Ocurrió un OverflowError durante la conversión a entero.")
# Convertir a float (maneja números grandes)
arr = arr.astype(float)
json_data = json.dumps(arr.tolist())
print(f"Conversión a flotante: {json_data}")
Manejo de Números Potencialmente Grandes
Si sus valores `int64` pudieran exceder el valor máximo representable por un entero estándar de Python, convertir a `float` es esencial para prevenir `OverflowError`. Los flotantes pueden manejar un rango mucho más amplio de valores numéricos.
Convirtiendo ‘int64’ a Cadenas
Convertir a cadenas es una alternativa sencilla si no necesita realizar operaciones matemáticas en los datos después de la serialización. Este es un enfoque robusto que evita posibles problemas de desbordamiento.
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)
Mejores Prácticas para la Serialización de Datos
Para un código más limpio y un mantenimiento más fácil, maneje consistentemente los tipos de datos antes de la serialización. Considere usar una librería de serialización dedicada si sus estructuras de datos son complejas. Siempre seleccione cuidadosamente el método de conversión apropiado (int, float o string) según los requisitos específicos de su aplicación.