jQuery devuelve "parsererror" para solicitud ajax


He estado obteniendo un "parsererror" de jquery para una solicitud Ajax, he intentado cambiar el POST a GET, devolviendo los datos de varias maneras diferentes (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ó.

Desplegable: (esto carga las "Vistas" de la lista en el Viewbag y disparar el evento funciona fine)

@{
    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 activa el evento de error para $.método ajax () diciendo "parsererror".

Author: David East, 2011-02-21

14 answers

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

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

Método Uno

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

Método Dos

O puedes hacer lo que @Sagiv estaba diciendo devolviendo tus datos como Json.

La razón por la que se produce este mensaje parserror es que cuando simplemente devuelve una cadena u otro valor, no es realmente Json, por lo que el el analizador falla al analizarlo.

Así que si elimina la propiedad dataType: json, 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.

 239
Author: David East,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-13 10:20:05

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

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

Tuve un problema similar recientemente al actualizar a jQuery 1.5. A pesar de obtener una respuesta correcta, el controlador de errores se disparó. Lo resolví usando el evento complete y luego comprobando el valor de estado. por ejemplo:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}
 27
Author: johnhunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:32

Ha especificado la respuesta de llamada ajax Tipo de datos como:

"json"

Donde como la respuesta ajax real no es un JSON válido y como resultado el analizador JSON está lanzando un error.

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

'texto'

Y dentro de la devolución de llamada de éxito validar si un JSON válido se está devolviendo o no, y si la validación JSON falla, alertarlo sobre el pantalla de modo que es obvio para qué propósito la llamada ajax está fallando realmente. 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);
    }
});
 11
Author: Nadeem Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-31 11:03:32

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

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

    }

Espero que ayude:)

 9
Author: Sagiv Ofek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-13 12:07:54

Sus datos JSON podrían estar equivocados. http://jsonformatter.curiousconcept.com / para validarlo.

 5
Author: Vishal Sakaria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-11 13:34:12

Hay muchas sugerencias para eliminar

dataType: "json"

Si bien reconozco que esto funciona, está ignorando 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. Considere 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, esto fue un problema con PHP escupiendo caracteres no deseados (en este caso, listas de materiales de archivo UTF). Una vez que eliminé estos solucionó el problema, mientras que también mantener

dataType: json
 4
Author: Sam Strachan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-17 16:34:19

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

 1
Author: Jahmic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-25 09:29:17

No se si esto sigue siendo real pero el problema fue con la codificación. Cambiar a ANSI resolvió el problema para mí.

 0
Author: George Dgebuadze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 16:20:58

Si obtiene este problema usando HTTP GET en IE, solucioné este problema configurando la caché: false. Como utilicé la misma url para las solicitudes HTML y json, golpeó la 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");
    }
});
 0
Author: Stuart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-19 10:50:54

Debe eliminar el tipo de datos: "json". Entonces ve la magia... la razón de hacer tal cosa es que está convirtiendo el objeto json a una cadena simple.. por lo tanto, json parser no es capaz de 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");
    }
 });
};
 0
Author: Sandipan Ghosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-29 19:44:11

En caso de obtener la operación de web. net mvc / api, asegúrese de que está permitir get

     return Json(data,JsonRequestBehavior.AllowGet);
 0
Author: Mohamed.Abdo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-04 08:03:32

También estaba obteniendo "Request return with error:parsererror."en la consola javascript. En mi caso no era una cuestión de Json, pero tuve que pasar al área de texto de la vista una codificación válida.

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);
 0
Author: Laura Liparulo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-26 15:59:43

El problema

Ventana.JSON.parse genera un error en $.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

Sobrecargar jQuery usando requirejs tool.

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

Jquery.sobrecarga.contenido del archivo 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
Author: Christian MEROUR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-10 23:31:37

Si no desea eliminar / cambiar dataType: json, puede anular el análisis estricto de jQuery definiendo un converter personalizado:

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

    ...

Usando 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()/success se activará siempre que la solicitud se haya realizado correctamente (código de respuesta 1xx o 2xx).

 -1
Author: alexw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-14 22:22:27