2014-07-11 10 views
5

Jsonify yöntemini çoğunlukla sözlükleri Json'a dönüştürmek için çok kullandığım Flask kullanarak bir web sitesi yapıyorum.Python veri yapısındaki tüm Decimals'lar dizgiye nasıl dönüştürülür?

sorun Decimals Ben de çok Ondalıklar kullanın ve maalesef jsonify işlem yapamadığı artık şudur:

=== (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 

Bu yüzden bir yöntem gibi içinde jsonify kaydırmak istedi:

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

yol açar Bu:

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

Maalesef bu, içinde bulunan Decimals'ı dönüştürmez bir dict veya liste.

Veri yapısını güvenli bir şekilde json'a dönüştürebilmem için python veri yapısı içindeki tüm ondalık sayıları (bir liste, bir dict, tuple vb.) Bir dizeye nasıl dönüştürebilirim? Eğer uygulama örneğinde json_encoder niteliğini ayarlayarak uygulamanın JSON kodlayıcı geçersiz kılabilir

+0

Belki de en iyi yol değil, bunun yerine "Decimal" alt sınıfını yapıp istediğinizi elde etmek için '__repr__' yöntemini geçersiz kılamadınız mı? –

cevap

12

:

import flask 

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

Sonra yapabilirsiniz alt sınıf Flask en JSONEncoder ve ek türleri için destek sağlamak için default() yöntemini geçersiz:

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)