Django如何将Decimal对象传递给json

时间:2012-11-06 18:17:07

标签: django json

我有一个包含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。当然我可以将值转换为字符串 - 但我猜这不是一个好的解决方案。

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:22)

Django已经包含了一个可以处理小数的编码器,以及日期时间:django.core.serializers.json.DjangoJSONEncoder。只需将其作为cls参数传递:

data = simplejson.dumps(ql, cls=DjangoJSONEncoder)

答案 1 :(得分:1)

以下是我在这个问题上找到的答案:Python JSON serialize a Decimal object

  

如何对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)