jQuery gibt "Parsererror" für eine Ajax-Anfrage zurück


186

Nachdem ich von jquery einen "Parsererror" für eine Ajax-Anfrage erhalten habe, habe ich versucht, den POST in einen GET zu ändern und die Daten auf verschiedene Arten zurückzugeben (Klassen erstellen usw.), aber ich kann nicht herausfinden, wo das Problem liegt.

Mein Projekt befindet sich in MVC3 und ich verwende jQuery 1.5. Ich habe ein Dropdown-Menü und beim Onchange-Ereignis starte ich einen Anruf, um einige Daten basierend auf den ausgewählten Daten abzurufen.

Dropdown: (Dies lädt die "Ansichten" aus der Liste im Viewbag und das Auslösen des Ereignisses funktioniert einwandfrei.)

@{
    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)

Javascript:

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

Der obige Code ruft erfolgreich die MVC-Methode auf und gibt Folgendes zurück:

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

Aber jquery löst das Fehlerereignis für die $ .ajax () -Methode aus, die "parsererror" sagt.


Löst es einen Javascript-Fehler in der Konsole aus oder wird die "Fehler" -Handlerfunktion des Befehls $ .ajax () ausgeführt?
Arnorhs

Entschuldigung, hätte genauer sein sollen, es löst die Fehlerfunktion $ .ajax () aus {alert ("Error"); }
Dkarzon

Irgendeine Chance auf einen Live-Link? Sehen Sie die JSON-Daten, die Sie in Firebug anzeigen?
Pekka

Nein, ich habe keinen Live-Link. Aber ja, das ist die in Firebug gezeigte JSON-Antwort.
Karzon

Ja, mein schlechtes war ein Tippfehler. Die Frage wurde
behoben

Antworten:


306

Ich bin kürzlich auf dieses Problem gestoßen und auf diese Frage gestoßen.

Ich habe es viel einfacher gelöst.

Methode Eins

Sie können die dataType: 'json'Eigenschaft entweder aus dem Objektliteral entfernen ...

Methode Zwei

Oder Sie können das tun, was @Sagiv gesagt hat, indem Sie Ihre Daten als zurückgeben Json.


Der Grund, warum diese parsererrorNachricht auftritt, ist, dass wenn Sie einfach eine Zeichenfolge oder einen anderen Wert zurückgeben, dies nicht wirklich Jsonder Fall ist , sodass der Parser beim Parsen fehlschlägt.

Wenn Sie die dataType: jsonEigenschaft entfernen , wird nicht versucht, sie als zu analysieren Json.

Wenn Sie bei der anderen Methode sicherstellen, dass Ihre Daten als zurückgegeben werden Json, weiß der Parser, wie er richtig damit umgeht.


4
Danke David, Methode Eins hat für mich funktioniert. In meinem Fall habe ich nichts zurückgegeben, sondern versehentlich einen Datentyp verwendet. Danke für den Tipp.
Krishna Teja Veeramachaneni

Vielen Dank für die Antwort. Ich habe die Antwort für die Quest aktualisiert, da dies eine bessere Lösung zu sein scheint.
Karkaron

Ich bin auf dieses Problem gestoßen, als mein PHP-Skript einen Fehler hatte und Nicht-JSON-Daten zurückgab - ein nützlicher Vorschlag zum Deaktivieren dataType !
Sharadh

Danke dir! Dies gilt auch für jquery.fileupload.js und andere Bibliotheken, die die JQuery AJAX-Methoden verwenden. Verwirrende Fehlermeldung!
kqr

Ich bekomme dieses Problem mit Rails jquery-ujs
Donato

29

In der Antwort von @ david-east finden Sie Informationen zur korrekten Behandlung des Problems

Diese Antwort ist nur für einen Fehler mit jQuery 1.5 relevant, wenn das Protokoll file: verwendet wird.

Ich hatte kürzlich ein ähnliches Problem beim Upgrade auf jQuery 1.5. Trotz korrekter Antwort wurde der Fehlerbehandler ausgelöst. Ich habe es behoben, indem ich das completeEreignis verwendet und dann den Statuswert überprüft habe. z.B:

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

1
Bestätigt behoben in JQuery 1.5.1
Johnhunter

13
Ich habe dieses Problem in 1.7.2 :(
Eystein Bye

6
Ich hatte gerade dieses Problem, aber ich habe den Datentyp 'json' entfernt und das Problem wurde behoben. Da es kein echtes Formular a json zurückgibt, tritt ein Parserfehler auf.
David East

3
Ich habe dieses Problem in 1.9.1 und habe es umgangen, indem meine API einen leeren Hash zurückgegeben hat {}. Schade, dass das notwendig ist.
Adam Tuttle

4
Dies ist tatsächlich in der Dokumentation: ...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

16

Sie haben den Ajax- Anrufantwortdatentyp wie folgt angegeben :

'json'

Wobei die eigentliche Ajax-Antwort kein gültiger JSON ist und der JSON-Parser daher einen Fehler auslöst.

Der beste Ansatz, den ich empfehlen würde, ist das Ändern des Datentyps in:

'Text'

Überprüfen Sie im Rahmen des erfolgreichen Rückrufs, ob ein gültiger JSON zurückgegeben wird oder nicht. Wenn die JSON-Überprüfung fehlschlägt, benachrichtigen Sie ihn auf dem Bildschirm, damit ersichtlich ist, zu welchem ​​Zweck der Ajax-Aufruf tatsächlich fehlschlägt. Schau dir das an:

$.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
oder entfernen Sie den Datentyp :)
Alexander

10

Das Problem ist, dass Ihr Controller eine Zeichenfolge oder ein anderes Objekt zurückgibt, das nicht analysiert werden kann. Der Ajax-Anruf sollte Json zurückbringen. Versuchen Sie, JsonResult im Controller wie folgt zurückzugeben:

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

    }

ich hoffe es hilft :)


Entschuldigung, ich habe vergessen, meinen Codebehind einzuschließen, aber genau so wird der Json zurückgegeben.
Karzon


4

Es gibt viele Vorschläge zum Entfernen

dataType: "json"

Obwohl ich zugebe, dass dies funktioniert, ignoriert es das zugrunde liegende Problem. Wenn Sie sicher sind, dass die Rückgabezeichenfolge wirklich JSON ist, suchen Sie zu Beginn der Antwort nach fehlerhaften Leerzeichen. Betrachten Sie es in Fiddler. Meins sah so aus:

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

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

In meinem Fall war dies ein Problem mit PHP, das unerwünschte Zeichen ausspuckte (in diesem Fall UTF-Stücklisten). Sobald ich diese entfernt habe, wurde das Problem behoben und gleichzeitig beibehalten

dataType: json

Stimmen Sie dem zu ... Ich habe die Antwort überprüft und es war ein var_dump (), der irgendwo in der App verloren gegangen ist.
Chuck

2

Stellen Sie sicher, dass Sie Debug-Code oder andere Elemente entfernen, die möglicherweise unbeabsichtigte Informationen ausgeben. Etwas offensichtlich, aber im Moment leicht zu vergessen.


0

Ich weiß nicht, ob dies noch aktuell ist, aber das Problem war mit der Codierung. Der Wechsel zu ANSI hat das Problem für mich gelöst.


0

Wenn Sie dieses Problem mit HTTP GET im IE erhalten, habe ich dieses Problem durch Setzen des Caches: false behoben. Da ich für HTML- und JSON-Anforderungen dieselbe URL verwendet habe, wurde sie in den Cache verschoben, anstatt einen JSON-Aufruf auszuführen.

$.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

Sie sollten den Datentyp "json" entfernen. Dann sehen Sie sich die Magie an ... Der Grund dafür ist, dass Sie ein JSON-Objekt in eine einfache Zeichenfolge konvertieren. Daher kann der JSON-Parser diese Zeichenfolge nicht analysieren, da er kein JSON-Objekt ist.

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

Stellen Sie im Falle des Abrufvorgangs von web .net mvc / api sicher, dass Sie get zulassen

     return Json(data,JsonRequestBehavior.AllowGet);

0

Ich erhielt auch "Rückgabe mit Fehler anfordern: Parsererror". in der Javascript-Konsole. In meinem Fall ging es nicht um Json, aber ich musste eine gültige Codierung an den Ansichtstextbereich übergeben.

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

0

Ich habe einen solchen Fehler festgestellt, aber nachdem ich meine Antwort geändert habe, bevor ich sie an den Client gesendet habe, hat sie einwandfrei funktioniert.

//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

Ich hatte das gleiche Problem, es stellte sich heraus, dass ich web.configmit meinen Teamkollegen nicht dasselbe war. Bitte überprüfen Sie Ihre web.config.

Hoffe das hilft jemandem.


-1

Das Problem

window.JSON.parse löst einen Fehler in der Funktion $ .parseJSON aus.

<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>

Meine Lösung

Überladen von JQuery mit dem Tool requirejs .

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

Inhalt der Datei 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

Wenn Sie nicht entfernen / ändern möchtendataType: json , können Sie die strikte Analyse von jQuery überschreiben, indem Sie eine benutzerdefinierte Funktion definieren 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 {};
            }
        }
    },

    ...

Auf diese Weise können Sie das Verhalten anpassen, wenn die Antwort nicht als JSON analysiert werden kann (selbst wenn Sie einen leeren Antworttext erhalten!).

Mit diesem benutzerdefinierten Konverter wird .done()/ successausgelöst, solange die Anforderung ansonsten erfolgreich war (1xx- oder 2xx-Antwortcode).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.