jQuery retornando “parsererror” para pedido ajax

Foi recebendo um “parsererror” do jquery para uma solicitação Ajax, tentei mudar o POST para um GET, retornando os dados de algumas maneiras diferentes (criação de classs, etc), mas eu não consigo descobrir qual é o problema.

Meu projeto está no MVC3 e estou usando o jQuery 1.5 Eu tenho um Dropdown e no evento onchange eu triggersr uma chamada para obter alguns dados com base no que foi selecionado.

Dropdown: (isso carrega as “Visualizações” da lista no Viewbag e triggers o evento funciona bem)

@{ var viewHtmls = new Dictionary(); viewHtmls.Add("data-bind", "value: ViewID"); viewHtmls.Add("onchange", "javascript:PageModel.LoadViewContentNames()"); } @Html.DropDownList("view", (List)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"); } }); }; 

O código acima chama com sucesso o método MVC e retorna:

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

Mas jquery triggers o evento de erro para o método $ .ajax () dizendo “parsererror”.

Recentemente encontrei esse problema e deparei com essa questão.

Eu resolvi isso com uma maneira muito mais fácil.

Método um

Você pode remover a propriedade dataType: 'json' do literal do object …

Método dois

Ou você pode fazer o que o @Sagiv estava dizendo, retornando seus dados como Json .

A razão pela qual essa mensagem de parserror ocorre é que quando você simplesmente retorna uma string ou outro valor, ela não é realmente Json , então o analisador falha ao analisá-la.

Portanto, se você remover a propriedade dataType: json , ela não tentará analisá-la como Json .

Com o outro método, se você retornar seus dados como Json , o analisador saberá como manipulá-lo corretamente.

Veja a resposta de @ david-east para a maneira correta de lidar com o problema

Esta resposta é relevante apenas para um bug com o jQuery 1.5 ao usar o file: protocol.

Eu tive um problema semelhante recentemente ao atualizar para o jQuery 1.5. Apesar de obter uma resposta correta, o manipulador de erros foi acionado. Eu resolvi isso usando o evento complete e, em seguida, verificando o valor do status. por exemplo:

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

Você especificou o dataType de resposta de chamada do ajax como:

‘json’

onde, como a resposta real do ajax não é um JSON válido e, como resultado, o analisador JSON está emitindo um erro.

A melhor abordagem que eu recomendaria é alterar o dataType para:

‘texto’

e no callback de sucesso, valide se um JSON válido está sendo retornado ou não, e se a validação JSON falhar, alerte-o na canvas para que seja óbvio com que finalidade a chamada do ajax está realmente falhando. Veja isso:

 $.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 problema é que seu controlador retorna string ou outro object que não pode ser analisado. a chamada do ajax esperava receber Json em troca. tente devolver o JsonResult no controlador da seguinte forma:

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

espero que ajude 🙂

Seus dados JSON podem estar errados. http://jsonformatter.curiousconcept.com/ para validá-lo.

Há muitas sugestões para remover

 dataType: "json" 

Embora eu admita que isso funciona, está ignorando o problema subjacente. Se você tiver certeza de que a string de retorno é realmente JSON, procure espaços em branco errôneos no início da resposta. Considere dar uma olhada no violinista. O meu parecia assim:

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

No meu caso, isso foi um problema com o PHP expelindo caracteres indesejados (neste caso, BOMs de arquivos UTF). Uma vez que eu removi estes, consertei o problema, mantendo

 dataType: json 

Certifique-se de remover qualquer código de debugging ou qualquer outra coisa que possa estar gerando informações não intencionais. Um pouco óbvio, mas fácil de esquecer no momento.

Eu não sei se isso ainda é real, mas o problema foi com a codificação. Mudar para ANSI resolveu o problema para mim.

Se você obtiver esse problema usando HTTP GET no IE, resolvi esse problema configurando o cache: false. Como eu usei o mesmo URL para ambos os pedidos, o HTML e o json, ele acessa o cache ao invés de fazer uma chamada 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"); } }); 

você deve remover o dataType: “json”. Então veja a mágica … a razão de fazer isso é que você está convertendo o object json para string simples .. então o json parser não é capaz de analisar essa string devido a não ser um object 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"); } }); }; 

Em caso de operação Get a partir da web .net mvc / api, certifique-se de que você está permitir obter

  return Json(data,JsonRequestBehavior.AllowGet); 

Eu também estava recebendo “Solicitar retorno com erro: parsererror”. no console do javascript. No meu caso, não era uma questão de Json, mas eu tinha que passar para a área de texto da view uma codificação válida.

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

O problema

window.JSON.parse gera um erro na function $ .parseJSON.

 
 $.parseJSON: function( data ) { ... // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } ... 

Minha solução

Sobrecarregando o JQuery usando a ferramenta requirejs .

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

conteúdo do arquivo jquery.overload.js

 
 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 $; }); 

Se você não quiser remover / mudar o dataType: json , você pode sobrescrever a análise estrita do jQuery definindo um converter customizado:

 $.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 isso, você pode personalizar o comportamento quando a resposta não pode ser analisada como JSON (mesmo se você receber um corpo de resposta vazio!)

Com este conversor personalizado, .done() / success será acionado desde que a solicitação tenha sido bem-sucedida (código de resposta 1xx ou 2xx).