$ .Ajax के साथ क्वेरी स्ट्रिंग के बजाय JSON कैसे भेजें?


172

क्या कोई आसान तरीके से समझा सकता है कि क्वेरी स्ट्रिंग के बजाय jQuery को वास्तविक JSON कैसे भेजें?

$.ajax({
    url      : url,
    dataType : 'json', // I was pretty sure this would do the trick
    data     : data,
    type     : 'POST',
    complete : callback // etc
});

यह वास्तव में आपके ध्यान से तैयार JSON को एक क्वेरी स्ट्रिंग में बदल देगा। कष्टप्रद चीजों में से एक यह है कि array: []आपकी किसी भी वस्तु को परिवर्तित कर दिया जाएगा array[]: [], शायद क्वेरी स्टिंग की सीमाओं के कारण।


7
dataTypeडेटा कैसे भेजा जाता है पर कोई प्रभाव नहीं। यह केवल यह निर्दिष्ट करता है कि आप किस प्रकार के डेटा को कॉल द्वारा वापस करने की अपेक्षा करते हैं। यदि आप सर्वर को इंगित करना चाहते हैं कि आप किस प्रकार का डेटा देख रहे dataहैं, तो आप उस संपत्ति को निर्दिष्ट कर रहे contentTypeहैं, जिसके समान आपको संपत्ति सेट करने की आवश्यकता हैcontentType: "application/json"
नोप

स्पष्टीकरण देने के लिए धन्यवाद। लेकिन उस मामले में, मुझे प्रतिक्रिया प्रकार क्लाइंट-साइड को निर्दिष्ट करने की आवश्यकता क्यों है यदि सर्वर प्रतिक्रिया में सामग्री-प्रकार हेडर प्रदान कर रहा है?
रेडसेंड्रो

2
आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है , डिफ़ॉल्ट रूप से jQuery कोशिश करेगा और MIME प्रकार की प्रतिक्रिया के आधार पर एक बुद्धिमान अनुमान लगाएगा। हालाँकि, यह निर्दिष्ट करके आप jQuery को स्पष्ट रूप से बता रहे हैं कि आप सर्वर से किस प्रकार की अपेक्षा कर रहे हैं और jQuery उस प्रकार के ऑब्जेक्ट की प्रतिक्रिया को बदलने का प्रयास करेगा। इसे निर्दिष्ट नहीं करने और jQuery छोड़ने का अनुमान लगाने के परिणामस्वरूप jQuery एक अप्रत्याशित प्रारूप में प्रतिक्रिया को परिवर्तित कर सकता है, भले ही आपने सर्वर से JSON भेजा हो। डेटाटाइप पर अधिक जानकारी के लिए दस्तावेज़ीकरण की जाँच करें: api.jquery.com/jQuery.ajax
Nope

जवाबों:


256

आपको JSON.stringifyअपनी वस्तु को पहले JSON पर अनुक्रमित करने के लिए उपयोग करने की आवश्यकता है , और फिर निर्दिष्ट करें contentTypeकि आपका सर्वर समझता है कि यह JSON है। यह काम कर जाना चाहिए:

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    contentType: "application/json",
    complete: callback
});

ध्यान दें कि JSONऑब्जेक्ट मूल रूप से उन ब्राउज़रों में उपलब्ध है जो JavaScript 1.7 / ECMAScript 5 या बाद के संस्करण का समर्थन करते हैं। यदि आपको विरासत समर्थन की आवश्यकता है तो आप json2 का उपयोग कर सकते हैं ।


14
यह काम नहीं करेगा, आप गायब हैं contentType: 'application/json'
ओहगोधी

@Ohododwhy ओह हाँ। वह बहुत तेज चला गया;)
mekwall

1
धन्यवाद। मैंने सोचा था कि डेटा टाइप ने इस बात का ध्यान रखा, लेकिन मुझे वह पीछे की ओर मिला। बेर्गी की तरह सामग्री-प्रकार में निर्दिष्ट करने पर कोई विचार अन्य उत्तर में किया था?
रेड्संड्रो

5
@Redsandro जो आवश्यक नहीं होना चाहिए। JQuery डॉक्स के अनुसार:POST data will always be transmitted to the server using UTF-8 charset, per the W3C XMLHTTPRequest standard
मेकवॉल

1
@ shorif2000 कभी भी देर से बेहतर ... समस्या यह है कि $_POSTphp में आप केवल देख सकते हैं application/x-www-form-urlencoded, यदि आप json डेटा पढ़ना चाहते हैं जो आपको करना चाहिए file_get_contents("php://input")और शायद तबjson_decode()
santiago arizti

28

नहीं, dataTypeविकल्प प्राप्त आंकड़ों को पार्स करने के लिए है।

JSON को पोस्ट करने के लिए, आपको इसके माध्यम से स्वयं को सख्त करना होगा JSON.stringifyऔर processDataविकल्प को सेट करना होगा false

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    processData: false,
    contentType: "application/json; charset=UTF-8",
    complete: callback
});

ध्यान दें कि सभी ब्राउज़र JSONऑब्जेक्ट का समर्थन नहीं करते हैं , और यद्यपि jQuery के पास है .parseJSON, इसमें कोई स्ट्रिंगर शामिल नहीं है; आपको एक और पॉलीफिल लाइब्रेरी की आवश्यकता होगी।


4
स्थापना processDataके लिए falseआवश्यक के बाद से नहीं है JSON.stringifyपहले से ही एक स्ट्रिंग देता है।
मीकावल

@MarcusEkwall: Afaik यह अभी भी encodeURIComponentएड होगा, है ना?
बर्गी

ठीक है, इसकी आवश्यकता नहीं हो सकती है, लेकिन क्या आपको वास्तव में लगता है कि यह अनुरोध को विफल कर देगा?
बर्गी

इसे पहले से ही एक स्ट्रिंग मानते हुए इसे विफल नहीं करना चाहिए।
केविन बी

1
@ रोदसंद्रो: हाँ, यह एक "बुद्धिमान अनुमान" है। हालांकि, पैरामीटर का कारण (केवल) यह नहीं है कि लोग इसे सख्त बनाना चाहते हैं, लेकिन इससे भी अधिक वे अपने सर्वर प्रतिक्रियाओं में उपयुक्त MIME प्रकार सेट नहीं करते हैं।
Bergi

5

जबकि मुझे पता है कि ASP.NET MVC जैसे कई आर्किटेक्चर ने JSON को संभालने के लिए अंतर्निहित कार्यक्षमता का उपयोग किया है। क्योंकि मेरी स्थिति थोड़ी अलग है, इसलिए शायद यह भविष्य में किसी की मदद कर सके। मुझे पता है कि इसने मुझे घंटों बचाया होगा!

चूँकि मेरे http अनुरोधों को IBM (AS400 वातावरण) के CGI API द्वारा एक अलग उपडोमेन पर संभाला जा रहा है, इसलिए ये अनुरोध क्रॉस ओरिजिनल हैं, इसलिए jsonp है। मैं वास्तव में जावास्क्रिप्ट ऑब्जेक्ट (ओं) के माध्यम से अपना अजाक्स भेजता हूं। यहाँ मेरे ajax POST का एक उदाहरण है:

 var data = {USER : localProfile,  
        INSTANCE : "HTHACKNEY",  
        PAGE : $('select[name="PAGE"]').val(), 
        TITLE : $("input[name='TITLE']").val(), 
        HTML : html,
        STARTDATE : $("input[name='STARTDATE']").val(), 
        ENDDATE : $("input[name='ENDDATE']").val(),
        ARCHIVE : $("input[name='ARCHIVE']").val(), 
        ACTIVE : $("input[name='ACTIVE']").val(), 
        URGENT : $("input[name='URGENT']").val(), 
        AUTHLST :  authStr};
        //console.log(data);
       $.ajax({
            type: "POST",
           url:   "http://www.domian.com/webservicepgm?callback=?",
           data:  data,
           dataType:'jsonp'
       }).
       done(function(data){
         //handle data.WHATEVER
       });

2
इस सवाल में और ज्ञान जोड़ने के लिए धन्यवाद! संतोषजनक जवाब पहले ही दिया जा चुका था, लेकिन मैंने आपका उत्थान किया।
रेडसंड्रो

1

अगर आप इसे वापस asp.net को भेज रहे हैं और request.form [] में डेटा की आवश्यकता है, तो आपको सामग्री को "एप्लिकेशन / x-www-form-urlencoded? Charset = utf-8" पर सेट करना होगा;

मूल पोस्ट यहाँ

दूसरी बात, डेटाटाइप से छुटकारा पाएं, यदि आपकी वापसी की उम्मीद नहीं है तो POST विफल होने से पहले लगभग 4 मिनट तक इंतजार करेगा। यहाँ देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.