2014-07-11 71 views
5

我正在建立一個網站,使用Flask,我使用jsonify方法很多將主要字典轉換爲Json。如何將Python數據結構中的所有小數轉換爲字符串?

的問題是,現在我也用小數很多,可惜jsonify不能處理小數:

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?

+0

也許不是最好的方法,但你可以不用'Decimal'子類來覆蓋它的'__repr__'方法來得到你想要的? –

回答

12

您可以通過設置json_encoder屬性上的應用程序實例重寫應用程序的JSON編碼器:

import flask 

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

然後你可以子類瓶的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) 
相關問題