2014-07-11 5 views
5

मैं Flask का उपयोग कर एक वेबसाइट बना रहा हूं, जिसमें से मैं जेसनिफ़ विधि का उपयोग ज्यादातर शब्दों को जेसन में परिवर्तित करने के लिए करता हूं।स्ट्रिंग के लिए एक पायथन डेटा संरचना में सभी दशमलव को कैसे परिवर्तित करें?

समस्या अब है कि मैं भी का उपयोग एक बहुत दशमलव, और दुर्भाग्य से jsonify संभाल सकते दशमलव:

=== (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 रैप करने के लिए चाहता था:

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

की ओर जाता है यह:

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

दुर्भाग्य से, यह दशमलव के भीतर स्थित दशमलवों को परिवर्तित नहीं करता है एक निर्देश या सूची।

मैं एक स्ट्रिंग में एक पाइथन डेटा संरचना (यह एक सूची, एक dict, एक tuple, आदि) के भीतर सभी दशमलव संख्या कैसे परिवर्तित कर सकते हैं ताकि मैं डेटास्ट्रक्चर को सुरक्षित रूप से जेसन में परिवर्तित कर सकूं?

+0

शायद सबसे अच्छा तरीका नहीं है, लेकिन आप इसके बजाय 'दशमलव' को उपclass नहीं कर सकते और अपनी इच्छित चीज़ों को प्राप्त करने के लिए '__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) 
संबंधित मुद्दे

 संबंधित मुद्दे