jQuery zwraca „parsererror” dla żądania ajax

186

Dostaję „parsererror” z jquery dla żądania Ajax, próbowałem zmienić POST na GET, zwracając dane na kilka różnych sposobów (tworzenie klas itp.), Ale wydaje mi się, że nie wiem, na czym polega problem.

Mój projekt jest w MVC3 i używam jQuery 1.5 Mam listę rozwijaną i przy zdarzeniu onchange odpalam połączenie, aby uzyskać dane na podstawie tego, co zostało wybrane.

Lista rozwijana: (ładuje to „Widoki” z listy w Viewbag i odpalenie wydarzenia działa dobrze)

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

Powyższy kod z powodzeniem wywołuje metodę MVC i zwraca:

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

Ale jquery odpala zdarzenie błędu dla metody $ .ajax () mówiąc „parsererror”.

dkarzon
źródło
czy wywołuje błąd javascript w konsoli, czy też wykonywana jest funkcja obsługi błędu polecenia $ .ajax ()?
arnorhs
przepraszam, powinien być bardziej szczegółowy, uruchamia funkcję błędu $ .ajax () {alert („Błąd”); }
dkarzon
Czy jest jakaś szansa na link na żywo? Czy widzisz dane JSON wyświetlane w Firebug?
Pekka
Nie, nie mam linku na żywo. Ale tak, to odpowiedź JSON pokazana w Firebug.
dkarzon
tak, mój zły był literówką. Naprawiono pytanie
dkarzon

Odpowiedzi:

306

Ostatnio napotkałem ten problem i natknąłem się na to pytanie.

Rozwiązałem to znacznie łatwiej.

Metoda pierwsza

Możesz albo usunąć dataType: 'json'właściwość z literału obiektu ...

Metoda druga

Możesz też zrobić to, co mówił @Sagiv, zwracając dane jako Json.


Powodem, dla którego parsererrorpojawia się ten komunikat, jest to, że po prostu zwracając ciąg lub inną wartość, tak naprawdę nie jest Json, więc analizator nie działa podczas analizowania.

Jeśli więc usuniesz dataType: jsonwłaściwość, nie będzie ona próbować go analizować jako Json.

Drugą metodą, jeśli zwrócisz dane jako Json, analizator składni będzie wiedział, jak poprawnie je obsługiwać.

David East
źródło
4
Dzięki David, Metoda Pierwsza zadziałała dla mnie. W moim przypadku nie zwracałem niczego, ale przez pomyłkę użyłem typu danych. Dzięki za wskazówkę.
Krishna Teja Veeramachaneni
Dzięki za odpowiedź, zaktualizowałem odpowiedź na zadanie, ponieważ wydaje się to lepszym rozwiązaniem.
dkarzon
Napotkałem ten problem, gdy mój skrypt php miał błąd i zwracał dane inne niż JSON - przydatna sugestia, aby ją wyłączyć dataType !
Sharadh
Dziękuję Ci! Dotyczy to także jquery.fileupload.js i innych bibliotek korzystających z metod AJAX JQuery. Mylący komunikat o błędzie!
kqr
Problem pojawia się przy użyciu Rails jquery-ujs
Donato,
29

Zobacz odpowiedź @ david-east, aby dowiedzieć się, jak rozwiązać problem

Ta odpowiedź dotyczy tylko błędu w jQuery 1.5 podczas korzystania z pliku: protokół.

Miałem ostatnio podobny problem podczas aktualizacji do jQuery 1.5. Pomimo otrzymania poprawnej odpowiedzi program obsługi błędów uruchomił się. Rozwiązałem go, używając completezdarzenia, a następnie sprawdzając wartość statusu. na przykład:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}
johnhunter
źródło
1
Potwierdzono naprawiono w JQuery 1.5.1
johnhunter
13
Mam ten problem w 1.7.2 :(
Eystein Bye
6
Właśnie miałem ten problem, ale usunąłem typ danych: „json” i problem został rozwiązany. Ponieważ nie zwraca prawdziwej postaci JSON, napotka błąd parsera.
David East
3
Mam ten problem w wersji 1.9.1 i udało mi się go obejść, ponieważ mój interfejs API zwrócił pusty skrót {}. Szkoda, że ​​to konieczne.
Adam Tuttle
4
To jest w rzeczywistości w dokumentacji: ...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

Podano dataType wywołania ajaxType jako:

„json”

gdzie jako faktyczna odpowiedź ajax nie jest prawidłowym JSON, w wyniku czego parser JSON zgłasza błąd.

Najlepszym podejściem, które poleciłbym, jest zmiana dataType na:

'tekst'

i w ramach wywołania zwrotnego powodzenia sprawdź, czy poprawny JSON jest zwracany, czy nie, a jeśli sprawdzanie poprawności JSON nie powiedzie się, zaalarmuj go na ekranie, aby było oczywiste, w jakim celu wywołanie ajax faktycznie nie działa. Zerknij na to:

$.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);
    }
});
Nadeem Khan
źródło
1
lub usuń typ danych :)
Alexander
10

Problem polega na tym, że kontroler zwraca ciąg znaków lub inny obiekt, którego nie można przeanalizować. oczekuje, że wywołanie ajax otrzyma w zamian Jsona. spróbuj zwrócić JsonResult w kontrolerze w następujący sposób:

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

    }

mam nadzieję, że to pomoże :)

Sagiv Ofek
źródło
Przepraszam, zapomniałem dołączyć moją nazwę kodową, ale dokładnie tak jest zwracany Json.
dkarzon
4

Istnieje wiele sugestii do usunięcia

dataType: "json"

Przyznaję, że to działa, ale ignoruje podstawowy problem. Jeśli masz pewność, że zwracanym ciągiem jest JSON, poszukaj błędnych białych znaków na początku odpowiedzi. Zastanów się, czy nie spojrzeć na to w skrzypaczu. Mój wyglądał tak:

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

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

W moim przypadku był to problem z PHP wyrzucającymi niechciane znaki (w tym przypadku LM pliku UTF). Po ich usunięciu naprawiłem problem, jednocześnie zachowując

dataType: json
Sam Strachan
źródło
Zgadzam się z tym ... Sprawdziłem odpowiedź i była to var_dump (), która zginęła gdzieś w aplikacji.
Chuck,
2

Upewnij się, że usunąłeś kod debugowania lub cokolwiek innego, co może generować niezamierzone informacje. Nieco oczywiste, ale w tej chwili łatwe do zapomnienia.

Jahmic
źródło
0

Nie wiem, czy to nadal jest aktualne, ale problem dotyczył kodowania. Przejście na ANSI rozwiązało problem dla mnie.

George Dgebuadze
źródło
0

Jeśli ten problem występuje przy użyciu HTTP GET w IE, rozwiązałem ten problem, ustawiając cache: false. Ponieważ użyłem tego samego adresu URL zarówno dla żądań HTML, jak i Json, trafił on do pamięci podręcznej zamiast wykonywać wywołanie 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");
    }
});
Stuart
źródło
0

powinieneś usunąć dataType: „json”. Następnie zobacz magię ... powodem takiego działania jest to, że konwertujesz obiekt json na prosty ciąg .. więc parser json nie jest w stanie przeanalizować tego ciągu ze względu na to, że nie jest obiektem 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");
    }
 });
};
Desi chłopcy
źródło
0

w przypadku Get operacji z sieci .net mvc / api, upewnij się, że masz zezwolenie na uzyskanie

     return Json(data,JsonRequestBehavior.AllowGet);
Mohamed.Abdo
źródło
0

Otrzymywałem również „Żądanie zwrotu z błędem: parsererror”. w konsoli javascript. W moim przypadku nie było to kwestią Jsona, ale musiałem przekazać poprawne kodowanie w polu tekstowym widoku.

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);
Laura Liparulo
źródło
0

Wystąpił taki błąd, ale po zmodyfikowaniu odpowiedzi przed wysłaniem jej do klienta zadziałało dobrze.

//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
}
Ananth Kumar Vasamsetti
źródło
0

Miałem ten sam problem, okazało się, że web.confignie był taki sam z kolegami z drużyny. Więc proszę sprawdź swojeweb.config .

Mam nadzieję, że to komuś pomoże.

Roshna Omer
źródło
-1

Problem

window.JSON.parse wywołuje błąd w funkcji $ .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>

Moje rozwiązanie

Przeciążenie JQuery za pomocą narzędzia RequJS .

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

zawartość pliku 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>
Christian MEROUR
źródło
-1

Jeśli nie chcesz usuwać / zmieniaćdataType: json , możesz zastąpić ścisłą analizę jQuery, definiując niestandardowe 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 {};
            }
        }
    },

    ...

Za pomocą tego można dostosować zachowanie, gdy odpowiedź nie może zostać przeanalizowana jako JSON (nawet jeśli otrzymasz pustą treść odpowiedzi!)

W tym niestandardowym konwerterze .done()/ successbędzie uruchamiane, dopóki żądanie nie zostanie pomyślnie wykonane (kod odpowiedzi 1xx lub 2xx).

alexw
źródło