unexpected syntaxerror parsererror datatype javascript c# jquery asp.net json

javascript - parsererror - syntaxerror unexpected token in json at position 1 ajax



jQuery devuelve "parsererror" para la solicitud de ajax (14)

He recibido un "parsererror" de jquery por una solicitud de Ajax, he intentado cambiar el POST por un GET, devolviendo los datos de diferentes maneras (creando clases, etc.) pero 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 en función de lo que se seleccionó.

Dropdown: (esto carga las "Vistas" de la lista en el Viewbag y activar 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".


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

return Json(data,JsonRequestBehavior.AllowGet);


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


Ha especificado el tipo de datos de respuesta de llamada ajax como:

''json''

donde la respuesta real de ajax no es una JSON válida y, como resultado, el analizador JSON está arrojando 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 se devuelve o no un JSON válido, y si la validación de JSON falla, alertarlo en la pantalla para que sea obvio para qué propósito falla la llamada ajax. 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); } });


Hace poco encontré 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 objeto literal ...

Método dos

O puede hacer lo que decía @Sagiv devolviendo sus datos como Json .

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

Por lo tanto, 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 manejarlo correctamente.


Hay muchas sugerencias para eliminar

dataType: "json"

Aunque concedo que esto funciona, está ignorando el problema subyacente. Si está seguro de que la cadena de retorno realmente es JSON, busque espacio en blanco errante al inicio de la respuesta. Considera echarle un vistazo en el violín. 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 era 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 y al mismo tiempo

dataType: json


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


Si obtiene este problema utilizando HTTP GET en IE, resolvió este problema configurando la caché: falso. Como utilicé la misma url para las solicitudes HTML y json, tocó 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"); } });



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

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


deberías eliminar el tipo de datos: "json". Luego, vea la magia ... la razón de hacerlo es que está convirtiendo el objeto json en una cadena simple ... por lo que el analizador json 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"); } }); };


el problema es que el 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 :)


El problema

window.JSON.parse provoca 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

Sobrecarga de 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>


Consulte la answer de @ david-east para conocer la forma correcta de manejar el problema

Esta respuesta solo es relevante para un error con jQuery 1.5 al usar el archivo: protocolo.

Recientemente tuve un problema similar al actualizar a jQuery 1.5. A pesar de obtener una respuesta correcta, el controlador de error disparó. Lo resolví utilizando el evento complete y luego verificando el valor de estado. p.ej:

complete: function (xhr, status) { if (status === ''error'' || !xhr.responseText) { handleError(); } else { var data = xhr.responseText; //... } }


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

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, se .done() / success siempre que la solicitud sea exitosa (código de respuesta 1xx o 2xx).