Estado recibiendo un «parsererror» de jquery para una petición Ajax, he tratado de cambiar el POST a un GET, devolver los datos en un par de maneras diferentes (la creación de clases, etc.) pero me parece que no puede averiguar cuál es el problema.

Mi proyecto está en MVC3 y estoy usando jQuery 1.5
Tengo una lista Desplegable y en el evento onchange me disparan una llamada para obtener algunos datos basados en lo que se ha seleccionado.

Desplegable: (este cargas de 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 con éxito llama al MVC método y devoluciones:

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

Pero jquery se desencadena el evento de error para el $.ajax() método diciendo: «parsererror».

  • hace fuego un error de javascript en la consola o el «error» el controlador de función de los us $.ajax() el comando se ejecuta?
  • lo siento, debería haber sido más específico, se desencadena el $.ajax() función de error { alert(«Error»); }
  • La oportunidad de un enlace en vivo? ¿Puedes ver los datos en JSON se muestran en Firebug?
  • No, yo no tengo un enlace en vivo. Pero sí que es la respuesta en JSON se muestra en Firebug.
  • sí, mi mal era un error tipográfico. Fija la pregunta
  • es demasiado corto para ser perfectamente honesto, ‘javascript:’ no debería estar ahí en todos los…
  • Probablemente no, había intentado un par de cosas. Pero eso no es el problema estoy teniendo, el evento es disparado correctamente.
  • También estoy recibiendo este problema con jQuery 1.7.2. El mío es un poco más complejo, aunque, como estoy tratando de usar un ajaxPrefilter contra un CORS de recursos. Sospecho que estoy teniendo el mismo problema como este tipo: bugs.jquery.com/ticket/12783 sólo estoy publicando esto aquí por si alguien también está recibiendo este problema en la última versión de jquery, mientras que tratando de analizar válido JSON.

InformationsquelleAutor dkarzon | 2011-02-21

16 Comentarios

  1. 272

    Hace poco me encontré con este problema y me encontré con esta pregunta.

    Lo resolvió con una manera mucho más fácil.

    Método Uno

    Puede quitar el dataType: 'json' propiedad del objeto literal…

    Método De Dos

    O usted puede hacer lo @Sagiv estaba diciendo por la devolución de sus datos como Json.


    La razón por la que este parsererror se produce el mensaje es que cuando lo devuelven una cadena u otro valor, no es realmente Json, por lo que el analizador cuando falla el análisis de la misma.

    Así que si usted quitar el dataType: json de la propiedad, no se intenta analizar como Json.

    Con el otro método si usted asegúrese de devolver sus datos como Json, el parser de saber cómo manejar la situación correctamente.

    • Gracias David, Un Método que funcionó para mí. En mi caso ya no me genera nada sino que se utiliza un tipo de datos por error. Gracias por la sugerencia.
    • Gracias por la respuesta, he actualizado la respuesta para la búsqueda como esto parece una mejor solución.
    • Me encontré con este problema cuando mi script de php que había un error, y volvía no datos JSON – una sugerencia útil para deshabilitar dataType hecho!
    • salvó el día :*
    • Gracias! Esto se aplica también a jquery.fileupload.js y otras bibliotecas mediante el AJAX de JQuery métodos. Confuso mensaje de error!
    • Estoy recibiendo este problema usando Rails, jquery-ujs
    • He utilizado para dataType = '' en lugar de quitarla.
    • Así que, me pregunto si no se puede analizar jsonarray?

  2. 27

    Ver el respuesta por @david-oriente de la forma correcta de manejar el problema

    Esta respuesta sólo es relevante para un bug con jQuery 1.5 cuando se utiliza el protocolo file:.

    Tuve un problema similar hace poco, cuando la actualización a jQuery 1.5. A pesar de obtener la respuesta correcta, el controlador de errores despedido. Lo resolvió mediante el uso de la complete evento y, a continuación, comprobar el valor de estado. e.g:

    complete: function (xhr, status) {
        if (status === 'error' || !xhr.responseText) {
            handleError();
        }
        else {
            var data = xhr.responseText;
            //...
        }
    }
    • No hay entradas en esta. Crea un caso de prueba y sólo puedo repetir el error de disparo cuando se accede a él con el protocolo file:. Así que este no es el mismo problema.
    • Ok, así que este tipo de trabajo. Tenía que usar un eval para reasignar el responseText a un objeto Json. Parece extraño que jQuery no trabajo para analizar la respuesta…
    • me alegro ayudó. Tener que eval el responseText es un dolor 🙁 I presentó una boleto en esto con JQuery. Resultó ser que se ha solucionado, y que estará en la versión 1.5.1. Puede referirse a su problema.
    • Confirmado fija en JQuery 1.5.1
    • Tengo este problema en la 1.7.2 🙁
    • Solo que tenía este problema, pero he quitado datatype: ‘json’ y se solucionó el problema. Ya no es la de regresar a una verdadera forma de un json que se va a encontrar un error del analizador.
    • Me estoy pegando esto en 1.7.2 así. La eliminación de tipo de datos: jsonp no es realmente una opción, sin embargo, cuando usted está usando jsonp para manejar una cruz de dominio de la situación
    • El problema fue corregido por mí en la 1.7.2 por la adición de dataType: «json»,
    • Estoy teniendo este problema en 1.9.1, y tengo alrededor de ella por tener a mi API de devolver un hash vacío {}. Vergüenza que esto es necesario.
    • Esto es en realidad 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
    • -1: Esta respuesta no es una buena solución, es sólo una solución y la falta de la causa raíz (que los comentarios y otras respuestas como @David describir).
    • Esto es indignante, porque de acuerdo a la especificación, volviendo 204NoContent con… ningún contenido, es perfectamente válido y fina sin embargo, jQuery insiste en que su servidor el defecto que tiene sentido. No sólo eso, sino que es no trivial, o tal vez imposible (todavía tengo que encontrar una manera) para modificar la completa devolución de llamada y de indicar el éxito en lugar de «parsererror».

  3. 15

    Ha especificado la llamada ajax respuesta tipo de datos como:

    ‘json’

    donde como la respuesta de ajax no es válido JSON y como resultado el JSON parser es tirar un error.

    El mejor enfoque que se recomienda es cambiar el tipo de datos a:

    ‘texto’

    y en el éxito de devolución de llamada de validar si un JSON válido es que se devuelven o no, y si JSON validación falla, alerta en la pantalla para que su evidente cuál es el propósito de la llamada ajax es realmente falla. Eche 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);
        }
    });
    • o eliminar el tipo de datos 🙂
  4. 10

    el problema es que el controlador de regresar de cadena u otro objeto que no puede ser analizado.
    la llamada ajax espera obtener Json en volver. intente volver JsonResult en el controlador como que:

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

    espero que ayude 🙂

    • Lo sentimos, se olvidó de incluir mi código subyacente, pero eso es exactamente cómo el Json devuelto.
  5. 4

    Hay un montón de sugerencias para quitar

    dataType: "json"

    Aunque admito que esto funciona es ignorar el problema subyacente. Si estás seguro de la cadena que devuelve realmente es JSON, a continuación, busque errante espacios en blanco al principio de la respuesta. Considere la posibilidad de tener una mirada al violinista. La mía se veía así:

    Connection: Keep-Alive
    Content-Type: application/json; charset=utf-8
    
    {"type":"scan","data":{"image":".\/output\/ou...

    En mi caso se trata de un problema con PHP arrojando caracteres no deseados (en este caso UTF archivo de la lista de materiales). Una vez me quitaron estos se solucionó el problema manteniendo también

    dataType: json
    • De acuerdo con esto… he comprobado que la respuesta fue un var_dump() que se perdió somwhere en la aplicación.
  6. 1

    Asegúrese de quitar cualquier código de depuración o cualquier otra cosa que podría ser la salida involuntaria de la información. Algo obvio, pero es fácil olvidó en el momento.

  7. 0

    Si usted recibe este problema mediante HTTP GET en IE he resuelto este problema mediante la configuración de la caché: falso.
    Como he utilizado la misma url para HTML y peticiones 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");
        }
    });
  8. 0

    debe quitar el dataType: «json». Luego de ver la magia… la razón de hacer tal cosa es la que va a convertir un objeto json a la cadena sencilla.. así json parser no es capaz de analizar dicha cadena debido a que al no ser 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");
        }
     });
    };
  9. 0

    en caso de Conseguir el funcionamiento de la web .net mvc/api, asegúrese de que permiten obtener

         return Json(data,JsonRequestBehavior.AllowGet);
  10. 0

    Yo también estaba recibiendo «Solicitud de devolución con el error:parsererror.» en la consola de javascript.
    En mi caso, no era una cuestión de Json, pero tuve que pasar a la vista de área de texto de una válida de la codificación.

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

    Me he encontrado con ese error, pero después de modificar mi respuesta antes de enviarla 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
    }
  12. 0

    Tuve el mismo problema, resultó mi web.config no era el mismo con mis compañeros de equipo.
    Así que por favor revise su web.config.

    Espero que esto ayude a alguien.

  13. -1

    El problema

    ventana.JSON.analizar genera un error en $.parseJSON función.

    <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

    La sobrecarga de JQuery usando requirejs herramienta.

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

    jquery.overload.js el contenido del archivo

    <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>
  14. -1

    Si usted no desea eliminar/cambiar dataType: json, puede reemplazar jQuery estricto análisis mediante la definición de 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 {};
                }
            }
        },
    
        ...

    Se utiliza esto, usted puede personalizar el comportamiento cuando la respuesta no puede ser analizado como JSON (incluso si usted consigue una respuesta vacía cuerpo!)

    Con este convertidor personalizado, .done()/success se activará siempre que la solicitud fue lo contrario el éxito (1xx o 2xx código de respuesta).

Dejar respuesta

Please enter your comment!
Please enter your name here