“TypeError: Object of type ‘int64’ is not JSON serializable” hatası, Python’da Pandas ve NumPy gibi kütüphanelerle çalışırken sıklıkla ortaya çıkar. Bunun nedeni, JSON’ın doğal olarak NumPy’nin `int64` veri türünü desteklememesidir. Bu kılavuz, bu sorunu çözmek için çözümler sunmaktadır.
İçindekiler
- `int64`’ü Standart Python Türlerine Dönüştürme
- Potansiyel Olarak Büyük Sayılarla Başa Çıkma
- `int64`’ü Metinlere Dönüştürme
- Veri Serileştirme İçin En İyi Uygulamalar
`int64`’ü Standart Python Türlerine Dönüştürme
`int64` değerlerini standart Python tamsayılarına (`int`) veya kayan noktalı sayılara (`float`) dönüştürmek en yaygın ve genellikle tercih edilen çözümdür. Bu, sayısal verileri korurken JSON uyumluluğunu sağlar.
Pandas Örneği:
import pandas as pd
import json
data = {'col1': [1, 2, 3, 4, 5, 2**63]} # Büyük bir sayı içeriyor
df = pd.DataFrame(data)
# int'e dönüştür (büyük sayılar için OverflowError oluşturacaktır)
try:
df['col1'] = df['col1'].astype(int)
json_data = json.dumps(df.to_dict('records'))
print(f"Tamsayı dönüşümü: {json_data}")
except OverflowError:
print("Integer dönüşümü sırasında OverflowError oluştu.")
# float'a dönüştür (büyük sayıları işler)
df['col1'] = df['col1'].astype(float)
json_data = json.dumps(df.to_dict('records'))
print(f"Float dönüşümü: {json_data}")
NumPy Örneği:
import numpy as np
import json
arr = np.array([1, 2, 3, 4, 5, 2**63], dtype=np.int64)
# int'e dönüştür (büyük sayılar için OverflowError oluşturacaktır)
try:
arr = arr.astype(int)
json_data = json.dumps(arr.tolist())
print(f"Tamsayı dönüşümü: {json_data}")
except OverflowError:
print("Integer dönüşümü sırasında OverflowError oluştu.")
# float'a dönüştür (büyük sayıları işler)
arr = arr.astype(float)
json_data = json.dumps(arr.tolist())
print(f"Float dönüşümü: {json_data}")
Potansiyel Olarak Büyük Sayılarla Başa Çıkma
`int64` değerleriniz standart bir Python tamsayısının temsil edebileceği maksimum değeri aşabilirse, `OverflowError`’ı önlemek için `float`’a dönüştürmek şarttır. Float’lar çok daha geniş bir sayısal değer aralığını işleyebilir.
`int64`’ü Metinlere Dönüştürme
Serileştirmeden sonra veriler üzerinde matematiksel işlem yapmanız gerekmiyorsa, metne dönüştürmek basit bir alternatiftir. Bu, olası taşma sorunlarını önleyen sağlam bir yaklaşımdır.
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)
Veri Serileştirme İçin En İyi Uygulamalar
Daha temiz kod ve daha kolay bakım için, serileştirmeden önce veri türlerini tutarlı bir şekilde işleyin. Veri yapılarınız karmaşıksa, özel bir serileştirme kütüphanesi kullanmayı düşünün. Özel uygulamanızın gereksinimlerine göre uygun dönüştürme yöntemini (int, float veya metin) her zaman dikkatlice seçin.