json.dumps vs flask.jsonify


276

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

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रिटर्न की तरह दिखता है। मैं क्या गलत कर रहा हूं?

जवाबों:


369

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

पूर्ण संदर्भ के लिए यहांjsonify() फ़ंक्शन के बारे में अधिक देखें ।

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


31
jsonify()अब सूचियाँ संभालता है। देखिए यह कमिट
जेफ विडमैन

3
लेकिन यह अभी भी SQLAlchemy ऑब्जेक्ट्स और सूचियों को JSON में नहीं बदलता है।
अंजबरास

91

तुम कर सकते हो:

flask.jsonify(**data)

या

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

82

ये है 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_appसंदर्भ है, Flask()अर्थात आपका आवेदन। वर्ग response_class()का एक संदर्भ है Response()


42

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

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

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


4
मुझे फर्क बिल्कुल समझ नहीं आता।
vidstige

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

3
@SamEsla हाँ, मुझे पता है, लेकिन इस जानकारी में से कोई भी इस जवाब में नहीं है।
vidstige

0

विचार करें

data={'fld':'hello'}

अभी

jsonify(data)

{'fld': 'hello'} और 'उपज' देगा

json.dumps(data)

देता है

"<html><body><p>{'fld':'hello'}</p></body></html>"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.