PythonでDecimal型のデータを扱うとき、そのデータをJSONにシリアライズするときに問題が発生することがあります。その問題は、「TypeError: Object of type ‘Decimal’ is not JSON serializable」というエラーメッセージで表されます。
この問題は、PythonのjsonモジュールがDecimal型をネイティブにサポートしていないために発生します。しかし、この問題を解決する方法はいくつかあります。
Decimalをfloatに変換する
Decimalオブジェクトのint/float値をシリアライズすることができます。
# dはあなたのdecimalオブジェクトと仮定します
serializable_d = int(d) # または float(d)
d_json = json.dumps(serializable_d)
ただし、Decimalオブジェクトは精度を保つために存在するため、floatにキャストすると不確実性が追加される可能性があります。
JSONEncoderを拡張する
jsonモジュールのJSONEncoderクラスを拡張して、Decimal型を文字列に変換してその精度を保つことができます。
from decimal import Decimal
import json
class DecimalEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Decimal):
return str(obj)
return json.JSONEncoder.default(self, obj)
# これを呼び出すには、json.dumps(some_object, cls=DecimalEncoder)を使用します
この方法では、外部パッケージに依存せずに良好な精度が維持されます。
以上の方法を試してみて、PythonでDecimal型をJSONにシリアライズする際の問題を解決できることを願っています。