8

Decimalオブジェクトを含むクエリセットがあります。このデータを次の行に沿ってjsonダンプに渡します。

ql = Product.objects.values_list('length', 'width').get(id=product_id)
data = simplejson.dumps(ql)

TypeError: Decimal('62.20') is not JSON serializable

これらの値をjsonに渡すにはどうすればよいですか。もちろん、値を文字列にキャストすることもできますが、これは良い解決策ではないと思います。

どんな助けでも大歓迎です。

4

2 に答える 2

23

Djangoには、小数点と日時を処理できるエンコーダーがすでに含まれていますdjango.core.serializers.json.DjangoJSONEncoderclsそれをパラメータとして渡すだけです。

data = simplejson.dumps(ql, cls=DjangoJSONEncoder)
于 2012-11-06T19:19:01.573 に答える
1

この質問で私が見つけた答えは次のとおりです。PythonJSONはDecimalオブジェクトをシリアル化します

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

class DecimalEncoder(simplejson.JSONEncoder):
    def _iterencode(self, o, markers=None):
        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)._iterencode(o, markers)

あなたの場合、あなたはそれをこのように使うでしょう:

data = simplejson.dumps(ql, cls=DecimalEncoder)
于 2012-11-06T18:42:10.730 に答える