javascript - AJAX अनुरोध के लिए jQuery "parsererror" लौट रहा है




c# asp.net (10)

वेब .net एमवीसी / एपीआई से ऑपरेशन प्राप्त करें, सुनिश्चित करें कि आपको अनुमति मिलती है

     return Json(data,JsonRequestBehavior.AllowGet);

एक अजाक्स अनुरोध के लिए jquery से "parsererror" प्राप्त करने के बाद, मैंने एक जीईटी में पोस्ट बदलने की कोशिश की है, कुछ अलग तरीकों से डेटा वापस कर रहा है (कक्षाएं बना रहा है) लेकिन मुझे लगता है कि समस्या क्या है।

मेरा प्रोजेक्ट एमवीसी 3 में है और मैं jQuery 1.5 का उपयोग कर रहा हूं। मेरे पास ड्रॉपडाउन है और ऑनचेंज इवेंट पर मैंने चुने गए विकल्पों के आधार पर कुछ डेटा प्राप्त करने के लिए कॉल बंद कर दी है।

ड्रॉपडाउन: (यह व्यूबैग में सूची से "दृश्य" लोड करता है और ईवेंट को ठीक से काम करता है)

@{
    var viewHtmls = new Dictionary<string, object>();
    viewHtmls.Add("data-bind", "value: ViewID");
    viewHtmls.Add("onchange", "javascript:PageModel.LoadViewContentNames()");
}
@Html.DropDownList("view", (List<SelectListItem>)ViewBag.Views, viewHtmls)

जावास्क्रिप्ट:

this.LoadViewContentNames = function () {
    $.ajax({
        url: '/Admin/Ajax/GetViewContentNames',
        type: 'POST',
        dataType: 'json',
        data: { viewID: $("#view").val() },
        success: function (data) {
            alert(data);
        },
        error: function (data) {
            debugger;
            alert("Error");
        }
    });
};

उपर्युक्त कोड सफलतापूर्वक एमवीसी विधि को कॉल करता है और लौटाता है:

[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"},
 {"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]

लेकिन jquery $ .ajax () विधि "parsererror" कहने के लिए त्रुटि घटना को सक्रिय करता है।



आपने AJAX कॉल प्रतिक्रिया डेटा निर्दिष्ट किया है टाइप करें:

'Json'

जहां वास्तविक AJAX प्रतिक्रिया मान्य JSON नहीं है और नतीजतन JSON पार्सर एक त्रुटि फेंक रहा है।

सबसे अच्छा तरीका जो मैं अनुशंसा करता हूं वह डेटा टाइप को बदलना है:

'पाठ'

और सफलता कॉलबैक के भीतर मान्य है कि वैध JSON वापस किया जा रहा है या नहीं, और यदि JSON सत्यापन विफल हो जाता है, तो उसे स्क्रीन पर चेतावनी दें ताकि यह स्पष्ट हो कि AJAX कॉल वास्तव में विफल रहा है। कृपया एक नज़र इसे देखिये:

$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    dataType: 'text',
    data: {viewID: $("#view").val()},
    success: function (data) {
        try {
            var output = JSON.parse(data);
            alert(output);
        } catch (e) {
            alert("Output is not valid JSON: " + data);
        }
    }, error: function (request, error) {
        alert("AJAX Call Error: " + error);
    }
});

मुझे "त्रुटि के साथ वापसी का अनुरोध भी मिल रहा था: parsererror।" जावास्क्रिप्ट कंसोल में। मेरे मामले में यह जेसन का मामला नहीं था, लेकिन मुझे दृश्य टेक्स्ट क्षेत्र को वैध एन्कोडिंग पास करना पड़ा।

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);

मैंने हाल ही में इस समस्या का सामना किया और इस सवाल पर ठोकर खाई।

मैंने इसे एक बहुत आसान तरीके से हल किया।

विधि एक

आप या तो dataType: 'json' कर सकते हैं dataType: 'json' ऑब्जेक्ट शाब्दिक से dataType: 'json' संपत्ति ...

विधि दो

या आप जेसन के रूप में अपना डेटा लौटकर @ सागीव कह रहे थे जो कर सकते हैं।

इस parserror संदेश का कारण यह है कि जब आप केवल एक स्ट्रिंग या किसी अन्य मान को वापस करते हैं, तो यह वास्तव में Json नहीं है, इसलिए पार्सर इसे पार्स करते समय विफल रहता है।

तो यदि आप dataType: json संपत्ति, यह Json रूप में इसे पार्स करने की कोशिश नहीं करेगा।

दूसरी विधि के साथ यदि आप अपने डेटा को Json रूप में वापस करना सुनिश्चित करते हैं, तो पार्सर को यह पता चलेगा कि इसे ठीक से कैसे संभालना है।


यदि आपको IE में HTTP GET का उपयोग करके यह समस्या मिलती है तो मैंने कैश सेट करके इस समस्या को हल किया: झूठा। जैसा कि मैंने एचटीएमएल और जेसन दोनों अनुरोधों के लिए एक ही यूआरएल का इस्तेमाल किया था, यह एक जेसन कॉल करने के बजाय कैश को मारा।

$.ajax({
    url: '/Test/Something/',
    type: 'GET',
    dataType: 'json',
    cache: false,
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
});

सुनिश्चित करें कि आप किसी भी डीबग कोड या किसी और चीज को हटा दें जो अनपेक्षित जानकारी आउटपुट कर रहा हो। कुछ हद तक स्पष्ट, लेकिन इस पल में भूलना आसान है।


हटाने के लिए बहुत सारे सुझाव हैं

dataType: "json"

जबकि मैं अनुदान देता हूं कि यह काम करता है यह अंतर्निहित मुद्दे को अनदेखा कर रहा है। अगर आपको विश्वास है कि रिटर्न स्ट्रिंग वास्तव में जेएसओएन है तो प्रतिक्रिया की शुरुआत में ग़लत सफेद जगह देखें। फिडलर में इसे देखने पर विचार करें। मेरा ऐसा दिखता है:

Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"type":"scan","data":{"image":".\/output\/ou...

मेरे मामले में यह PHP के साथ अवांछित वर्णों को बाहर निकालने में समस्या थी (इस मामले में यूटीएफ फ़ाइल बीओएम)। एक बार जब मैंने इन्हें हटा दिया तो यह भी ध्यान में रखते हुए समस्या को ठीक कर दिया

dataType: json

इस मुद्दे को संभालने के सही तरीके के लिए @ डेविड-पूर्व द्वारा answer देखें

फ़ाइल का उपयोग करते समय यह उत्तर केवल jQuery 1.5 के साथ एक बग के लिए प्रासंगिक है: प्रोटोकॉल।

JQuery 1.5 में अपग्रेड करते समय मुझे हाल ही में एक ही समस्या थी। सही प्रतिक्रिया मिलने के बावजूद त्रुटि हैंडलर निकाल दिया गया। मैंने complete घटना का उपयोग करके और फिर स्थिति मान की जांच करके इसे हल किया। उदाहरण के लिए:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}

यदि आप dataType: json को हटाना / बदलना नहीं चाहते हैं dataType: json , आप कस्टम converter को परिभाषित करके jQuery के सख्त पार्सिंग को ओवरराइड कर सकते हैं:

$.ajax({
    // We're expecting a JSON response...
    dataType: 'json',

    // ...but we need to override jQuery's strict JSON parsing
    converters: {
        'text json': function(result) {
            try {
                // First try to use native browser parsing
                if (typeof JSON === 'object' && typeof JSON.parse === 'function') {
                    return JSON.parse(result);
                } else {
                    // Fallback to jQuery's parser
                    return $.parseJSON(result);
                }
            } catch (e) {
               // Whatever you want as your alternative behavior, goes here.
               // In this example, we send a warning to the console and return 
               // an empty JS object.
               console.log("Warning: Could not parse expected JSON response.");
               return {};
            }
        }
    },

    ...

इसका उपयोग करके, जब आप JSON के रूप में प्रतिक्रिया को पार्स नहीं किया जा सकता है तो आप व्यवहार को कस्टमाइज़ कर सकते हैं (भले ही आपको खाली प्रतिक्रिया निकाय हो!)

इस कस्टम कनवर्टर के साथ, .done() / success तब तक ट्रिगर की जाएगी जब तक अनुरोध अन्यथा सफल नहीं हुआ (1xx या 2xx प्रतिक्रिया कोड)।





json