【python】TypeError: Object of type 'Decimal' is not JSON serializable と言われた

概要

以下のエラーが出てのでメモ。

TypeError: Object of type 'Decimal' is not JSON serializable

また、Qiiaにすでに解決記事を出している方がおり、私も丸コピなので基本的におなじことをしています。

ドキュメントに以下の記載があります。これを使用します。

default を指定する場合は関数を指定して、この関数はそれ以外では直列化できないオブジェクトに対して呼び出されます。 その関数は、オブジェクトを JSONエンコードできるバージョンにして返すか、さもなければ TypeError を送出しなければなりません。 指定しない場合は、 TypeError が送出されます。

直列化できないオブジェクトに対して呼び出される、つまりオブジェクトが配列であれば配列内の値に対して、2次元配列であれば配列内の配列内の値に対して有効になります。引数として値が渡されてくるので、その値がDecimal型であれば適切にキャストして返す、みたいにすれば良いです。

なんで自分でこんなことを書かないといけないかがわからないのですが、pythonにも都合があるのでしょう。。。 わかる方がいれば教えてください。

解決策

def decimal_default_proc(obj):
    from decimal import Decimal
    if isinstance(obj, Decimal):
        return float(obj)
    raise TypeError
print(json.dumps(value, default=decimal_default_proc))