1. ホーム
  2. python

[解決済み】PythonのJSONでDecimalオブジェクトをシリアライズする

2022-01-28 07:56:12

質問

を持っています。 Decimal('3.9') をオブジェクトの一部としてエンコードし、次のようなJSON文字列にしたい。 {'x': 3.9} . クライアント側では精度を気にしないので、floatでいいんです。

これをシリアライズする良い方法はないでしょうか?JSONDecoderはDecimalオブジェクトを受け付けないし、あらかじめfloatに変換しておくと、次のような結果になります。 {'x': 3.8999999999999999} これは間違っており、帯域幅の大きな無駄となります。

解決方法は?

サブクラス化するのはどうでしょう json.JSONEncoder ?

class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            # wanted a simple yield str(o) in the next line,
            # but that would mean a yield on the line with super(...),
            # which wouldn't work (see my comment below), so...
            return (str(o) for o in [o])
        return super(DecimalEncoder, self).default(o)

そして、このように使用します。

json.dumps({'x': decimal.Decimal('5.5')}, cls=DecimalEncoder)