जेकरी अजाक्स पोस्टिंग जन्स टू वेब्स सर्विस


238

मैं एक asp.net webservice को JSON ऑब्जेक्ट पोस्ट करने का प्रयास कर रहा हूं।

मेरा जसन इस तरह दिखता है:

var markers = { "markers": [
  { "position": "128.3657142857143", "markerPosition": "7" },
  { "position": "235.1944023323615", "markerPosition": "19" },
  { "position": "42.5978231292517", "markerPosition": "-3" }
]};

मैं json2.js का उपयोग कर रहा हूं ताकि मेरी json ऑब्जेक्ट को कड़ा किया जा सके।

और मैं अपने webservice को पोस्ट करने के लिए jquery का उपयोग कर रहा हूं।

  $.ajax({
        type: "POST",
        url: "/webservices/PodcastService.asmx/CreateMarkers",
        data: markers,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(data){alert(data);},
        failure: function(errMsg) {
            alert(errMsg);
        }
  });

मुझे निम्नलिखित त्रुटि प्राप्त हो रही है:

"अमान्य जेन्सन आदिम:

मुझे इससे संबंधित पोस्टों का एक समूह मिला है और यह वास्तव में एक आम समस्या है, लेकिन कुछ भी नहीं मैं इस समस्या को हल करने की कोशिश करता हूं।

जब फायरबग क्या सर्वर पर पोस्ट किया जा रहा है, यह इस तरह दिखता है:

मार्कर% 5B0% 5D% 5Bposition% 5D = 128.3657142857143 और मार्कर% 5B0% 5D% 5BmarkerPosition% 5D = 7 और मार्कर% 5B1% 5D% 5Bposition% 5D = 235.1944023323615 और मार्कर% 5B1% 5D% 5BmarkerPosition% 5D = 19 और मार्कर% 5B2% 5D% 5Bposition% 5D = 42.5978231292517 और मार्कर% 5B2% 5D% 5BmarkerPosition% 5D = -3

कहा जा रहा है कि मेरी webservice समारोह है:

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}

api.jquery.com/jQuery.ajax में सूचीबद्ध लोगों के बीच 'विफलता' संभव सेटिंग के रूप में प्रदान नहीं की गई है ... हो सकता है कि आपने इसके बजाय इसे 'त्रुटि' के साथ गलत किया हो?
डेनिकोटरा

जवाबों:


390

आपने अपना डेटा स्ट्रिंग करने के लिए json2.js का उपयोग करने का उल्लेख किया है, लेकिन पोस्ट किया गया डेटा URLEncoded JSON प्रतीत होता है। आपने पहले ही इसे देख लिया होगा, लेकिन अमान्य JSON प्राइमेटिव कवर के बारे में यह पोस्ट बताती है कि JSON का URL URL कोड क्यों किया जा रहा है।

मैं आपके विधि में कच्चे, मैन्युअल रूप से क्रमबद्ध JSON स्ट्रिंग को पारित करने के खिलाफ सलाह दूंगा । ASP.NET अपने आप JSON के अनुरोध के POST डेटा को स्वचालित रूप से निष्क्रिय करने जा रहा है, इसलिए यदि आप मैन्युअल रूप से ASP.NET को JSON स्ट्रिंग भेज रहे हैं और भेज रहे हैं, तो आप वास्तव में JSON को अपने JSON क्रमांकित स्ट्रिंग को अनुक्रमित करेंगे।

मैं इन पंक्तियों के साथ कुछ और बताना चाहूंगा:

var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },
               { "position": "235.1944023323615", "markerPosition": "19" },
               { "position": "42.5978231292517", "markerPosition": "-3" }];

$.ajax({
    type: "POST",
    url: "/webservices/PodcastService.asmx/CreateMarkers",
    // The key needs to match your method's input parameter (case-sensitive).
    data: JSON.stringify({ Markers: markers }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){alert(data);},
    failure: function(errMsg) {
        alert(errMsg);
    }
});

अमान्य JSON आदिम समस्या से बचने के लिए कुंजी jQuery dataपैरामीटर JSON स्ट्रिंग को पास करने के लिए है , जावास्क्रिप्ट ऑब्जेक्ट नहीं, ताकि jQuery आपके डेटा को URLEncode करने का प्रयास न करे।

सर्वर-साइड पर, आपके द्वारा पास किए जा रहे डेटा के आकार के लिए अपनी विधि के इनपुट मापदंडों से मिलान करें:

public class Marker
{
  public decimal position { get; set; }
  public int markerPosition { get; set; }
}

[WebMethod]
public string CreateMarkers(List<Marker> Markers)
{
  return "Received " + Markers.Count + " markers.";
}

Marker[] Markersयदि आप चाहें, तो आप एक सरणी भी स्वीकार कर सकते हैं। ASMX ScriptServices (JavaScriptSerializer) का उपयोग करने वाला deserializer बहुत लचीला है, और यह वह करेगा जो आपके इनपुट डेटा को आपके द्वारा निर्दिष्ट सर्वर-साइड प्रकार में परिवर्तित कर सकता है।


4
आपने लिखा "ताकि jQuery आपके डेटा को URLEncode करने का प्रयास न करे।", लेकिन यह सही नहीं है। अपने डेटा को urlencoding से jquery को रोकने के लिए, आपको प्रोसेसडैट को झूठा सेट करना होगा।
सॉफ्टलिऑन

8
एक स्ट्रिंग में पास होना jQuery को URLEncoding से डेटा पैरामीटर को रोकने के लिए पर्याप्त है। आप processData को गलत पर सेट कर सकते हैं, लेकिन यह बहुत ही कम है (और डेटा के लिए JSON स्ट्रिंग में उत्तीर्ण हुए बिना, अकेले ऐसा करना पर्याप्त नहीं है)।
डेव वार्ड

1
यही मुद्दा (और उत्तर) रेल पर भी लागू होता है।
ग्रेग

2
contentTypeअगर हम GET का उपयोग करते हैं और POST नहीं तो क्या @DaveWard को माना जाता है?
रॉय नमिर

@RoyiNamir यदि आप ASMX ScriptServices या ASPX WebMethods का उपयोग कर रहे हैं, तो आपको JSON को वापस लाने के लिए POST का उपयोग करने की आवश्यकता है। यदि आपको GET, सामग्री-प्रकार सही है या नहीं, तो आपको इसके बजाय XML मिलेगा।
डेव वार्ड

19
  1. markersएक JSON ऑब्जेक्ट नहीं है। यह एक सामान्य जावास्क्रिप्ट वस्तु है।
  2. data:विकल्प के बारे में पढ़ें :

    सर्वर पर भेजा जाने वाला डेटा। इसे क्वेरी स्ट्रिंग में बदल दिया जाता है , यदि पहले से ही स्ट्रिंग नहीं है।

यदि आप JSON के रूप में डेटा भेजना चाहते हैं, तो आपको पहले इसे एनकोड करना होगा:

data: {markers: JSON.stringify(markers)}

jQuery स्वचालित रूप से वस्तुओं या सरणियों को JSON में परिवर्तित नहीं करता है।


लेकिन मुझे लगता है कि त्रुटि संदेश सेवा की प्रतिक्रिया की व्याख्या करने से आता है। आपके द्वारा वापस भेजा गया पाठ JSON नहीं है। JSON स्ट्रिंग्स को दोहरे उद्धरण चिह्नों में संलग्न किया जाना है। तो आपको करना होगा:

return "\"received markers\"";

मुझे यकीन नहीं है कि आपकी वास्तविक समस्या डेटा भेज रही है या प्राप्त कर रही है।


आपके लिए धन्यवाद फेलिक्स की मदद करने के लिए, मैंने सोचा कि JSON.stringyfy विधि के माध्यम से मार्करों को चलाकर मैं इसे एक क्वेरी स्ट्रिंग में परिवर्तित कर रहा था, मैंने जैसा कि आपने सुझाव दिया है, लेकिन दुर्भाग्य से यह काम नहीं करता है मैं निम्नलिखित पोस्ट नहीं कर रहा हूं।
कोड फिरौन

मार्कर =% 7B% 22markers% 22% 3 ए% 5 ब% 7B% 22position% 22% 3 ए% 22,128.3657142857143% 22% 2C% 22markerPosition% 22% 3 ए% 227% 22% 7 दिन% 2C% 7B% 22position% 22% 3 ए% 22,235.1944023323615 % 22% 2C% 22markerPosition% 22% 3 ए% 2219% 22% 7 दिन% 2C% 7B% 22position% 22% 3 ए% 2242.5978231292517% 22% 2C% 22markerPosition% 22% 3 ए% 22-3% 22% 7 दिन% 5D% 7 दिन
कोड फिरौन

@ डगरट्स: यह मेरे लिए थोड़ा अस्पष्ट है कि आप क्या चाहते हैं। क्या आप markersJSON स्ट्रिंग के रूप में भेजना चाहते हैं ?
फेलिक्स क्लिंग

हाय फेलिक्स, हाँ मैं मार्कर ऑब्जेक्ट को JSON स्ट्रिंग के रूप में भेजना चाहता हूं ताकि मैं इसे अपने वेबसर्वर में उपयोग कर सकूं।
कोड फिरौन

@ ड्रीम्स: फिर इसे इस तरह से काम करना चाहिए। साथ ही आपने जिस "कोड" को टिप्पणी में पोस्ट किया है वह ठीक लग रहा है। बेशक आपको इसे सर्वर पर ठीक से डिकोड करना होगा और हो सकता है कि आपको पैरामीटर का नाम बदलना पड़े, मुझे नहीं पता।
फेलिक्स क्लिंग

3

मैंने डेव वार्ड के समाधान की कोशिश की। डेटा हिस्सा पोस्ट अनुरोध के रूप में की पेलोड भाग में ब्राउज़र से भेजा जा रहा नहीं कर रहा था contentType के लिए निर्धारित है "application/json"। एक बार जब मैंने इस लाइन को हटा दिया तो सब कुछ बहुत अच्छा हुआ।

var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },

               { "position": "235.1944023323615", "markerPosition": "19" },

               { "position": "42.5978231292517", "markerPosition": "-3" }];

$.ajax({

    type: "POST",
    url: "/webservices/PodcastService.asmx/CreateMarkers",
    // The key needs to match your method's input parameter (case-sensitive).
    data: JSON.stringify({ Markers: markers }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){alert(data);},
    failure: function(errMsg) {
        alert(errMsg);
    }
});

2

मैंने इसका भी सामना किया है और यह मेरा समाधान है।

यदि आप डेटा को पार्स करते समय एक अमान्य json ऑब्जेक्ट अपवाद का सामना कर रहे हैं, भले ही आपको पता हो कि आपका json string सही है, तो JSON को पार्स करने से पहले अपने ajax कोड में प्राप्त डेटा को स्ट्रिंग करें:

$.post(CONTEXT+"servlet/capture",{
        yesTransactionId : yesTransactionId, 
        productOfferId : productOfferId
        },
        function(data){
            try{
                var trimData = $.trim(JSON.stringify(data));
                var obj      = $.parseJSON(trimData);
                if(obj.success == 'true'){ 
                    //some codes ...

1

मेरे पास क्वेरी है,

$("#login-button").click(function(e){ alert("hiii");

        var username = $("#username-field").val();
        var password = $("#username-field").val();

        alert(username);
        alert("password" + password);



        var markers = { "userName" : "admin","password" : "admin123"};
        $.ajax({
            type: "POST",
            url: url,
            // The key needs to match your method's input parameter (case-sensitive).
            data: JSON.stringify(markers),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data){alert("got the data"+data);},
            failure: function(errMsg) {
                alert(errMsg);
            }
        });

    });

मैं लॉगिन विवरण को json में पोस्ट कर रहा हूं और जैसे ही एक स्ट्रिंग प्राप्त कर "Success"रहा हूं, लेकिन मुझे प्रतिक्रिया नहीं मिल रही है।


1
यह सवाल का जवाब नहीं है। यदि आप प्रश्न पूछना चाहते हैं तो "प्रश्न" मेनू पर जाएं और "प्रश्न पूछें" पर क्लिक करें, और यदि आपका प्रश्न इस प्रश्न से संबंधित है, तो अपने प्रश्न में संदर्भ लिंक प्रदान करें।
मित्तल पटेल

-2

कृपया इसे java var parbs = {feildName: feildValue} के वेबसर्वर द्वारा ajax कॉल के लिए फॉलो करें; JSON.stringify ({डेटा: परम})

$.ajax({
            dataType    : 'json',
            type        : 'POST',
            contentType : 'application/json',
            url         : '<%=request.getContextPath()%>/rest/priceGroups',
            data        : JSON.stringify({data : param}),
            success     : function(res) {
                if(res.success == true){
                    $('#alertMessage').html('Successfully price group created.').addClass('alert alert-success fade in');
                    $('#alertMessage').removeClass('alert-danger alert-info');
                    initPriceGroupsList();
                    priceGroupId = 0;
                    resetForm();                                                                    
                }else{                          
                    $('#alertMessage').html(res.message).addClass('alert alert-danger fade in');
                }
                $('#alertMessage').alert();         
                window.setTimeout(function() { 
                    $('#alertMessage').removeClass('in');
                    document.getElementById('message').style.display = 'none';
                }, 5000);
            }
        });

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