如何将Python数据结构中的所有小数转换为字符串?

17 投票
1 回答
9633 浏览
提问于 2025-04-18 13:00

我正在用Flask搭建一个网站,里面经常用到jsonify这个方法,把字典转换成Json格式。

现在的问题是,我也经常使用Decimal(十进制数),但是很不幸的是,jsonify无法处理Decimal:

jsonify({'a': Decimal('1')})

这样会导致:

=== (a long stacktrace preceding this) ===
File "/usr/local/lib/python2.7/dist-packages/flask/json.py", line 83, in default
return _json.JSONEncoder.default(self, o)
File "/usr/lib/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: Decimal('1') is not JSON serializable

所以我想把jsonify封装成一个像这样的函数:

def myOwnJsonify(item):
    if isinstance(item, Decimal):
        return flask.jsonify(str(item))
    else:
        return flask.jsonify(item)

但是不幸的是,这个方法并不能转换字典或列表中的Decimal。

我该如何把Python数据结构中的所有Decimal数字(无论是列表、字典、元组等)转换成字符串,这样我就可以安全地把这个数据结构转换成json格式呢?

1 个回答

39

你可以通过设置应用实例的 json_encoder 属性来覆盖应用的 JSON 编码器:

import flask

app = flask.Flask(...)
app.json_encoder = MyJSONEncoder

然后,你可以创建一个 Flask 的 JSONEncoder 子类,并重写 default() 方法,以支持更多类型的数据:

import decimal
import flask.json

class MyJSONEncoder(flask.json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, decimal.Decimal):
            # Convert decimal instances to strings.
            return str(obj)
        return super(MyJSONEncoder, self).default(obj)

撰写回答