jQuery अजाक्स अनुरोध के लिए "parsererror" लौट रहा है


186

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

मेरी परियोजना एमवीसी 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");
        }
    });
};

उपरोक्त कोड MVC विधि को सफलतापूर्वक कॉल करता है और वापस आता है:

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

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


क्या यह कंसोल में एक जावास्क्रिप्ट त्रुटि को आग लगाता है या $ .ajax () कमांड के "एरर" हैंडलर फ़ंक्शन को निष्पादित करता है?
arnorhs

क्षमा करें, यह अधिक विशिष्ट होना चाहिए था, यह $ .ajax () त्रुटि फ़ंक्शन {चेतावनी ("त्रुटि") को आग लगाता है; }
dkarzon

लाइव लिंक का कोई मौका? क्या आप फायरबग में दिखाए गए JSON डेटा को देखते हैं?
पेक्का

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

हाँ, मेरा बुरा एक टाइपो था। सवाल तय
dkarzon

जवाबों:


306

मैंने हाल ही में इस समस्या का सामना किया और इस सवाल पर लड़खड़ा गया।

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

विधि एक

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

विधि दो

या आप ऐसा कर सकते हैं जो @Sagiv आपके डेटा को वापस करके कह रहा था Json


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

इसलिए यदि आप dataType: jsonसंपत्ति को हटाते हैं, तो वह इसे पार्स करने की कोशिश नहीं करेगा Json

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


4
धन्यवाद डेविड, मेथड वन ने मेरे लिए काम किया। मेरे मामले में मैं कुछ भी वापस नहीं कर रहा था, लेकिन गलती से डेटाटाइप का इस्तेमाल किया। पारितोषिक के लिए धन्यवाद।
कृष्ण तेजा वीरमचन्नी

प्रतिक्रिया के लिए धन्यवाद, मैंने खोज के लिए उत्तर को अपडेट किया है क्योंकि यह एक बेहतर समाधान की तरह लगता है।
डेकरजोन

मुझे इस समस्या का सामना करना पड़ा जब मेरी php स्क्रिप्ट में त्रुटि थी, और गैर-JSON डेटा लौटा रहा था - dataType वास्तव में अक्षम करने के लिए एक उपयोगी सुझाव !
शरद

धन्यवाद! यह JQuery AJAX विधियों का उपयोग करके jquery.fileupload.js और अन्य पुस्तकालयों पर भी लागू होता है। भ्रामक त्रुटि संदेश!
15

मुझे यह समस्या रेलिंग jquery-ujs
Donato

29

समस्या को सही तरीके से हल करने के लिए @ david- पूर्व द्वारा उत्तर देखें

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

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

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

1
JQuery 1.5.1 में पुष्टि की गई
जॉनहंटर

13
मुझे 1.7.2 :( में इस समस्या है
Eystein Bye

6
मुझे बस यह समस्या आ रही थी, लेकिन मैंने डेटाटाइप हटा दिया: 'json' और समस्या हल हो गई। चूँकि यह एक सच्चे रूप को वापस नहीं लौटा रहा है, इसलिए यह एक पार्सर त्रुटि का सामना करेगा।
डेविड ईस्ट

3
मुझे 1.9.1 में यह समस्या आ रही है, और मैंने अपने एपीआई को एक खाली हैश लौटाकर इसे प्राप्त किया है {}। शर्म आती है यह आवश्यक है।
एडम टटल

4
यह वास्तव में प्रलेखन में है: ...The JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} instead. api.jquery.com/jQuery.ajax
Rob

17

आपने ajax कॉल रिस्पांस डेटा टाइप किया है:

'Json'

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

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

'पाठ'

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

$.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);
    }
});

1
या डेटाटाइप हटा दें :)
अलेक्जेंडर

10

समस्या यह है कि आपका नियंत्रक स्ट्रिंग या अन्य ऑब्जेक्ट लौटा सकता है जिसे पार्स नहीं किया जा सकता है। अजैक्स कॉल के बदले में Json मिलने की उम्मीद है। नियंत्रक की तरह JsonResult को वापस करने की कोशिश करें:

 public JsonResult YourAction()
    {
        ...return Json(YourReturnObject);

    }

आशा करता हूँ की ये काम करेगा :)


क्षमा करें, मेरे कोडबेहैंड को शामिल करना भूल गया, लेकिन वास्तव में यह है कि कैसे Json वापस आ गया है।
डेकरजॉन


4

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

dataType: "json"

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

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

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

मेरे मामले में यह अवांछित चरित्रों को उगलने वाली एक समस्या थी (इस मामले में UTF फ़ाइल BOMs)। एक बार जब मैंने इन्हें हटा दिया तो यह समस्या को भी रखते हुए ठीक कर दिया

dataType: json

इससे सहमत ... मैंने प्रतिक्रिया की जाँच की और यह एक var_dump () था जो ऐप में कहीं खो गया था।
चक

2

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


0

मुझे नहीं पता कि यह अभी भी वास्तविक है लेकिन समस्या एनकोडिंग के साथ थी। ANSI में बदलने से मेरे लिए समस्या का समाधान हो गया।


0

यदि आपको IE में HTTP GET का उपयोग करके यह समस्या आती है तो मैंने कैश सेट करके इस समस्या को हल किया: असत्य। जैसा कि मैंने HTML और json दोनों के लिए एक ही url का उपयोग किया है, यह json कॉल करने के बजाय कैश को हिट करता है।

$.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");
    }
});

0

आपको डेटा टाइप हटाना चाहिए: "json"। फिर देखें जादू ... इस तरह के काम करने का कारण यह है कि आप जेंस ऑब्जेक्ट को साधारण स्ट्रिंग में परिवर्तित कर रहे हैं .. इसलिए json parser उस स्ट्रिंग को पार्स नहीं कर पा रहा है जो कि json ऑब्जेक्ट नहीं है।

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

0

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

     return Json(data,JsonRequestBehavior.AllowGet);

0

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

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

0

मुझे इस तरह की त्रुटि का सामना करना पड़ा है लेकिन ग्राहक को भेजने से पहले मेरी प्रतिक्रिया को संशोधित करने के बाद यह ठीक काम किया।

//Server side
response = JSON.stringify('{"status": {"code": 200},"result": '+ JSON.stringify(result)+'}');
res.send(response);  // Sending to client

//Client side
success: function(res, status) {
    response = JSON.parse(res); // Getting as expected
    //Do something
}

0

मुझे भी यही समस्या थी, पता चला web.configकि मेरे साथियों के साथ ऐसा नहीं था। तो कृपया अपनी जाँच करें web.config

आशा है कि यह किसी की मदद करता है।


-1

समस्या

window.JSON.parse $ .parseJSON फ़ंक्शन में त्रुटि उठाता है।

<pre>
$.parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
</pre>

मेरा समाधान

आवश्यकता उपकरण का उपयोग करके JQuery को ओवरलोड करना ।

<pre>
define(['jquery', 'jquery.overload'], function() { 
    //Loading jquery.overload
});
</pre>

jquery.overload.js फ़ाइल सामग्री

<pre>
define(['jquery'],function ($) { 

    $.parseJSON: function( data ) {
        // Attempt to parse using the native JSON parser first
        /**  THIS RAISES Parsing ERROR
        if ( window.JSON && window.JSON.parse ) {
            return window.JSON.parse( data );
        }
        **/

        if ( data === null ) {
            return data;
        }

        if ( typeof data === "string" ) {

            // Make sure leading/trailing whitespace is removed (IE can't handle it)
            data = $.trim( data );

            if ( data ) {
                // Make sure the incoming data is actual JSON
                // Logic borrowed from http://json.org/json2.js
                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
                    .replace( rvalidtokens, "]" )
                    .replace( rvalidbraces, "")) ) {

                    return ( new Function( "return " + data ) )();
                }
            }
        }

        $.error( "Invalid JSON: " + data );
    }

    return $;

});
</pre>

-1

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

$.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 प्रतिक्रिया कोड) था।

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