簡體   English   中英

如何將Python數據結構中的所有十進制轉換為字符串?

[英]How to convert all Decimals in a Python data structure to string?

我正在使用Flask構建一個網站,我從中大量使用jsonify方法將字典轉換為Json。

問題是現在我也經常使用Decimals,不幸的是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)

不幸的是,這不會轉換位於字典或列表中的十進制數。

如何將python數據結構中的所有十進制數字(無論是列表,字典,元組等)轉換為字符串,以便我可以安全地將數據結構轉換為json?

您可以通過在應用程序實例上設置json_encoder屬性來覆蓋應用程序的JSON編碼器:

import flask

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

然后你可以對Flask的JSONEncoder進行子類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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM