2011-10-26 7 views
162

मुझे यकीन नहीं है कि मैं flask.jsonify विधि के उद्देश्य को समझता हूं। मैं इस से JSON स्ट्रिंग बनाने की कोशिश:json.dumps बनाम flask.jsonify

data = {"id": str(album.id), "title": album.title} 

लेकिन क्या मैं json.dumps साथ मिल रहा flask.jsonify साथ क्या मिलता है से अलग है।

json.dumps(data): [{"id": "4ea856fd6506ae0db42702dd", "title": "Business"}] 
flask.jsonify(data): {"id":…, "title":…} 

जाहिर है मैं एक परिणाम है कि अधिक क्या json.dumps रिटर्न की तरह लग रहा प्राप्त करने की आवश्यकता। मैं क्या गलत कर रहा हूं?

+2

वेबसाइकिलों पर एक लंबा प्रश्न लिख रहा था और जब मैं इस पर ठोकर खा रहा था तो 'jsonify' सही डेटा वापस नहीं कर रहा था। 'Json.dumps' को ठीक करता है जो मुझे चाहिए था। –

उत्तर

206

फ्लास्क में jsonify() फ़ंक्शन एक flask.Response() वस्तु पहले से ही json के साथ उपयोग के लिए उपयुक्त सामग्री प्रकार शीर्ष लेख 'आवेदन/json' है प्रतिक्रियाओं। जबकि, json.dumps() विधि केवल एक एन्कोडेड स्ट्रिंग लौटाएगी, जिसे मैन्युअल प्रकार के शीर्षलेख को मैन्युअल रूप से जोड़ने की आवश्यकता होगी।

पूर्ण संदर्भ के लिए jsonify() फ़ंक्शन here के बारे में और जानें।

संपादित करें: इसके अलावा, मैंने देखा है कि jsonify() kwargs या शब्दकोश को संभालता है, जबकि json.dumps() अतिरिक्त सूचियों और अन्य का समर्थन करता है।

+15

'jsonify()' अब सूची को संभालती है। [यह प्रतिबद्ध] देखें (https://github.com/mitsuhiko/flask/commit/431db2874b242316051963d9bc4d5653b3647acc)। –

78

आप कर सकते हैं:

flask.jsonify(**data) 

या

flask.jsonify(id=str(album.id), title=album.title) 
50

यह flask.jsonify()

def jsonify(*args, **kwargs): 
    if __debug__: 
     _assert_have_json() 
    return current_app.response_class(json.dumps(dict(*args, **kwargs), 
     indent=None if request.is_xhr else 2), mimetype='application/json') 

इस्तेमाल किया json मॉड्यूल या तो simplejson या इसी क्रम में json है। current_appFlask() ऑब्जेक्ट का संदर्भ है यानी आपका आवेदन। response_class()Response() कक्षा का संदर्भ है।

+2

यह सही जवाब होना चाहिए ... – tyan

20

एक या दूसरे की पसंद इस बात पर निर्भर करती है कि आप क्या करना चाहते हैं। मैं क्या समझते हैं से:

  • jsonify उपयोगी होगा जब आप एक एपीआई किसी क्वेरी और बदले में json उम्मीद करेंगे निर्माण कर रहे हैं। उदा।: REST github API आपके अनुरोध का उत्तर देने के लिए इस विधि का उपयोग कर सकता है।

  • डंप, जेसन में डेटा/पायथन ऑब्जेक्ट बनाने और आपके आवेदन के अंदर उस पर काम करने के बारे में अधिक है। उदाहरण के लिए, मुझे किसी ऑब्जेक्ट को मेरी प्रस्तुति परत पर पास करने की आवश्यकता है जहां कुछ जावास्क्रिप्ट ग्राफ़ प्रदर्शित करेगा। आप डंप द्वारा उत्पन्न जेसन के साथ जावास्क्रिप्ट फ़ीड करेंगे।

+1

मुझे अंतर बिल्कुल नहीं समझा। – vidstige

+5

@ vidstige: ** jsonify ** एक फ्लास्क बनाता है।प्रतिक्रिया() ऑब्जेक्ट अपने हेडर के साथ "सामग्री-प्रकार: एप्लिकेशन/जेसन" के रूप में सेट किया गया है, इसका पेलोड रूपांतरित-से-JSON-string dict के रूप में सेट है। ** डंप ** बस एक रूपांतरित-से-JSON-string बनाता है। यह एक उचित रूप से स्वरूपित फ्लास्क नहीं है। प्रतिक्रिया() वस्तु। तो यदि आपका विचार कहता है "वापसी json.dumps (dict)", तो प्राप्तकर्ता को पर्सलोड के रूप में json.dumps आउटपुट के साथ नियमित "सामग्री-प्रकार: टेक्स्ट/एचटीएमएल" प्रतिक्रिया मिलेगी। – SamEsla

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