jQuery devuelve "parsererror" para la solicitud ajax

186

Al obtener un "parsererror" de jquery para una solicitud de Ajax, he intentado cambiar la POST a una GET, devolviendo los datos de diferentes maneras (creando clases, etc.) pero parece que no puedo entender cuál es el problema.

Mi proyecto está en MVC3 y estoy usando jQuery 1.5. Tengo un menú desplegable y, en el evento onchange, disparo una llamada para obtener algunos datos basados ​​en lo que se seleccionó.

Menú desplegable: (esto carga las "Vistas" de la lista en el Viewbag y disparar el evento funciona bien)

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

El código anterior llama con éxito al método MVC y devuelve:

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

Pero jquery dispara el evento de error para el método $ .ajax () que dice "parsererror".

dkarzon
fuente
¿activa un error de JavaScript en la consola o se ejecuta la función del controlador "error" del comando $ .ajax ()?
Arnorhs
lo siento, debería haber sido más específico, activa la función de error $ .ajax () {alert ("Error"); }
dkarzon
¿Alguna posibilidad de un enlace en vivo? ¿Ves los datos JSON que muestras en Firebug?
Pekka
No, no tengo un enlace en vivo. Pero sí, esa es la respuesta JSON que se muestra en Firebug.
dkarzon
Sí, mi error fue un error tipográfico. Se
corrigió

Respuestas:

306

Recientemente encontré este problema y me topé con esta pregunta.

Lo resolví de una manera mucho más fácil.

Método uno

Puede eliminar la dataType: 'json'propiedad del objeto literal ...

Método dos

O puede hacer lo que @Sagiv estaba diciendo devolviendo sus datos como Json.


La razón por la parsererrorque aparece este mensaje es que cuando simplemente devuelve una cadena u otro valor, en realidad no lo es Json, por lo que el analizador falla al analizarlo.

Por lo tanto, si elimina la dataType: jsonpropiedad, no intentará analizarla como Json.

Con el otro método, si se asegura de devolver sus datos como Json, el analizador sabrá cómo manejarlos correctamente.

David East
fuente
44
Gracias David, el Método Uno funcionó para mí. En mi caso, no estaba devolviendo nada, pero usé un tipo de datos por error. Gracias por el consejo.
Krishna Teja Veeramachaneni
Gracias por la respuesta, he actualizado la respuesta para la búsqueda, ya que parece una mejor solución.
dkarzon
Encontré este problema cuando mi script php tenía un error y estaba devolviendo datos que no son JSON, ¡una sugerencia útil para deshabilitar dataType !
Sharadh
¡Gracias! Esto también se aplica a jquery.fileupload.js y otras bibliotecas que utilizan los métodos JQuery AJAX. Mensaje de error confuso!
kqr
Recibo este problema usando Rails jquery-ujs
Donato
29

Vea la respuesta de @ david-east para conocer la forma correcta de manejar el problema

Esta respuesta solo es relevante para un error con jQuery 1.5 cuando se usa el archivo: protocolo.

Tuve un problema similar recientemente cuando actualicé a jQuery 1.5. A pesar de obtener una respuesta correcta, se activó el controlador de errores. Lo resolví usando el completeevento y luego verificando el valor del estado. p.ej:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}
johnhunter
fuente
1
Confirmado fijo en JQuery 1.5.1
johnhunter
13
Tengo este problema en 1.7.2 :(
Eystein Bye
66
Estaba teniendo este problema, pero eliminé el tipo de datos: 'json' y el problema se resolvió. Como no devuelve una forma verdadera de un json, se encontrará con un error del analizador.
David East
3
Tengo este problema en 1.9.1, y lo solucioné haciendo que mi API devuelva un hash vacío {}. Es una pena que esto sea necesario.
Adam Tuttle
44
Esto está realmente en la documentación: ...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

Ha especificado la respuesta de llamada AJAX tipo de datos como:

'json'

donde, como la respuesta real de ajax no es un JSON válido y, como resultado, el analizador JSON arroja un error.

El mejor enfoque que yo recomendaría es cambiar el tipo de datos a:

'texto'

y dentro de la devolución de llamada exitosa, valide si se devuelve un JSON válido o no, y si la validación de JSON falla, alertarlo en la pantalla para que sea obvio para qué propósito la llamada ajax realmente falla. Echa un vistazo a esto:

$.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
fuente
1
o eliminar el tipo de datos :)
Alexander
10

El problema es que su controlador devuelve una cadena u otro objeto que no se puede analizar. la llamada ajax esperaba obtener a Json a cambio. intente devolver JsonResult en el controlador así:

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

    }

Espero eso ayude :)

Sagiv Ofek
fuente
Lo siento, olvidé incluir mi código detrás, pero así es exactamente como se devuelve el Json.
dkarzon
4

Hay muchas sugerencias para eliminar

dataType: "json"

Si bien reconozco que esto funciona, ignora el problema subyacente. Si está seguro de que la cadena de retorno realmente es JSON, busque espacios en blanco errantes al comienzo de la respuesta. Considera echarle un vistazo en Fiddler. El mío se veía así:

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

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

En mi caso, se trataba de un problema con PHP que arrojaba caracteres no deseados (en este caso, BOM de archivos UTF). Una vez que los eliminé, solucionó el problema mientras mantenía

dataType: json
Sam Strachan
fuente
De acuerdo con esto ... Verifiqué la respuesta y fue un var_dump () que se perdió en algún lugar de la aplicación.
Chuck
2

Asegúrese de eliminar cualquier código de depuración o cualquier otra cosa que pueda generar información no deseada. Algo obvio, pero fácil de olvidar en el momento.

Jahmic
fuente
0

No sé si esto todavía es real, pero el problema fue con la codificación. Cambiar a ANSI resolvió el problema para mí.

George Dgebuadze
fuente
0

Si tiene este problema usando HTTP GET en IE, resolví este problema configurando el caché: falso. Como utilicé la misma URL para las solicitudes HTML y json, llegó al caché en lugar de hacer una llamada 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
fuente
0

debe eliminar el tipo de datos: "json". Entonces vea la magia ... la razón de hacer eso es que está convirtiendo el objeto json en una cadena simple ... por lo que json parser no puede analizar esa cadena debido a que no es un objeto 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");
    }
 });
};
Chicos desi
fuente
0

en caso de obtener la operación desde web .net mvc / api, asegúrese de que está permitido obtener

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

También recibí "Solicitud de devolución con error: parsererror". en la consola javascript. En mi caso, no se trataba de Json, pero tuve que pasar al área de texto de vista una codificación válida.

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

He encontrado dicho error, pero después de modificar mi respuesta antes de enviarlo al cliente funcionó bien.

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

Tuve el mismo problema, resultó que web.configno era lo mismo con mis compañeros de equipo. Así que por favor revisa tu web.config.

Espero que esto ayude a alguien.

Roshna Omer
fuente
-1

El problema

window.JSON.parse genera un error en la función $ .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>

Mi solución

Sobrecargando JQuery usando la herramienta requirejs .

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

Contenido del archivo 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
fuente
-1

Si no desea eliminar / cambiardataType: json , puede anular el análisis estricto de jQuery definiendo una costumbre 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 {};
            }
        }
    },

    ...

Con esto, puede personalizar el comportamiento cuando la respuesta no se puede analizar como JSON (¡incluso si obtiene un cuerpo de respuesta vacío!)

Con este convertidor personalizado, .done()/ successse activará siempre que la solicitud haya sido satisfactoria (código de respuesta 1xx o 2xx).

alexw
fuente