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

时间:2014-07-11 21:36:44

标签: python json dictionary flask decimal

我正在使用Flask建立一个网站,我从中大量使用jsonify方法将字典转换为Json。

现在的问题是我也经常使用Decimals,遗憾的是jsonify无法处理Decimals:

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)

不幸的是,这并没有转换位于字典或列表中的小数。

如何将python数据结构中的所有十进制数字(无论是列表,字典,元组等)转换为字符串,以便我可以安全地将数据结构转换为json?

1 个答案:

答案 0 :(得分:16)

您可以通过在应用程序实例上设置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)