8

我有一个包含十进制对象的查询集。我想按照以下方式将此数据传递给 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.DjangoJSONEncoder. 只需将其作为cls参数传递:

data = simplejson.dumps(ql, cls=DjangoJSONEncoder)
于 2012-11-06T19:19:01.573 回答
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)
于 2012-11-06T18:42:10.730 回答