it-swarm.com.de

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

Ich habe einen "Parsererror" von jquery für eine Ajax-Anfrage erhalten und versucht, POST zu einem GET zu ändern, wobei die Daten auf verschiedene Arten zurückgegeben wurden (Erstellen von Klassen usw.), aber ich kann nicht scheinen herauszufinden, was das Problem ist.

Mein Projekt ist in MVC3 und ich verwende jQuery 1.5. Ich habe eine Dropdown-Liste und beim Ereignis onchange feuere ich einen Anruf ab, um einige Daten basierend auf der Auswahl abzurufen.

Dropdown: (dies lädt die "Views" aus der Liste im Viewbag und das Auslösen des Events 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 die MVC-Methode erfolgreich 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, das "Parsererror" sagt.

168
dkarzon

Ich bin vor kurzem auf dieses Problem gestoßen und auf diese Frage gestoßen.

Ich habe es viel einfacher gelöst.

Methode Eins

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

Methode Zwei

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


Der Grund, warum diese Nachricht parsererror auftritt, ist, dass wenn Sie einfach eine Zeichenfolge oder einen anderen Wert zurückgeben, es nicht wirklich Json ist, sodass der Parser beim Parsen fehlschlägt.

Wenn Sie also die Eigenschaft dataType: json Entfernen, wird nicht versucht, sie als Json zu analysieren.

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

274
David East

In answer von @ david-east finden Sie Informationen zur korrekten Behandlung des Problems.

Diese Antwort ist nur relevant für ein Fehler mit jQuery 1.5 bei Verwendung der Datei: Protokoll.

Ich hatte kürzlich ein ähnliches Problem beim Upgrade auf jQuery 1.5. Trotz korrekter Antwort wurde der Fehlerbehandler ausgelöst. Ich habe es gelöst, indem ich das complete -Ereignis 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;
        //...
    }
}
27
johnhunter

Sie haben die Antwort des Ajax-Aufrufs dataType wie folgt angegeben:

'json'

dabei ist die tatsächliche Ajax-Antwort kein gültiger JSON-Code, und der JSON-Parser gibt einen Fehler aus.

Der beste Ansatz, den ich empfehlen würde, ist, das dataType zu ändern:

'Text'

überprüfen Sie innerhalb des erfolgreichen Rückrufs, ob ein gültiger JSON zurückgegeben wird oder nicht. Wenn die JSON-Überprüfung fehlschlägt, zeigen Sie ihn auf dem Bildschirm an, 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);
    }
});
15
Nadeem Khan

das Problem ist, dass Ihr Controller einen String oder ein anderes Objekt zurückgibt, das nicht analysiert werden kann. Der Ajax-Aufruf sollte Json zurückbringen. Versuchen Sie, JsonResult folgendermaßen im Controller zurückzugeben:

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

    }

ich hoffe es hilft :)

10
Sagiv Ofek

Ihre JSON-Daten sind möglicherweise falsch. http://jsonformatter.curiousconcept.com/ um es zu validieren.

5
Vishal Sakaria

Es gibt viele Vorschläge zum Entfernen

dataType: "json"

Ich gebe zwar zu, dass dies funktioniert, ignoriere aber das zugrunde liegende Problem. Wenn Sie sicher sind, dass der Rückgabestring 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-Datei-Stücklisten). Nachdem ich diese entfernt hatte, wurde das Problem behoben und gleichzeitig beibehalten

dataType: json
4
Sam Strachan

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

1
Jahmic

stellen Sie sicher, dass Sie für den Fall, dass Sie eine Operation von web .net mvc/api erhalten, die Erlaubnis erhalten

     return Json(data,JsonRequestBehavior.AllowGet);
0
Mohamed.Abdo

Ich erhielt auch die Meldung "Rückgabe mit Fehler anfordern: Parsererror". in der Javascript-Konsole. In meinem Fall handelte es sich nicht um Json, sondern ich musste eine gültige Codierung an den Anzeigetextbereich übergeben.

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

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

Ich hatte das gleiche Problem, stellte sich heraus, mein web.config war nicht dasselbe mit meinen Teamkollegen. Bitte überprüfe dein web.config.

Hoffe das hilft jemandem.

0
Roshna Omer

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

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
}

Wenn Sie dieses Problem mit HTTP GET in IE======================================================================================= Ich habe habe habe ich habe habe habe habe habe habe habe habe dass dass dass dass dass dass dass dass dass dass dass dass dass dass dass dass dass dass dass der dass der der der der der der der der der der der der der der der der der der der der der der der der der der der der der der der der json anruf.

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