jQuery返回“parsererror”为ajax请求

从jquery得到一个“parsererror”为一个Ajax请求,我试图改变POST到一个GET,以不同的方式返回数据(创build类等),但我似乎无法弄清楚是什么问题。

我的项目是在MVC3和我正在使用jQuery 1.5我有一个下拉列表和onchange事件我发起一个调用来获取一些基于select的数据。

下拉菜单:(从Viewbag中的列表中加载“视图”并触发事件工作正常)

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

上面的代码成功地调用了MVC方法并返回:

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

但jquery触发了错误事件的$ .ajax()方法说“parsererror”。

我最近遇到这个问题,偶然发现了这个问题。

我用一个更简单的方法解决了它。

方法一

你可以从对象文字中删除dataType: 'json'属性…

方法二

或者,您可以通过将您的数据作为Json返回来做什么@Sagiv。

这个parserror消息发生的原因是当你简单的返回一个string或者其他的值时,它并不是真正的Json ,所以parsing器parsing的时候会失败。

所以如果你删除dataType: json属性,它不会试图把它parsing为Json

如果您确定以Json返回数据,则parsing器将知道如何正确处理它。

请参阅@ david-east的答案 ,了解处理问题的正确方法

这个答案只与使用file:protocol时jQuery 1.5的一个bug有关。

升级到jQuery 1.5时最近有类似的问题。 尽pipe得到了一个正确的响应error handling程序被解雇 我解决了它通过使用complete事件,然后检查状态值。 例如:

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

问题是你的控制器返回的string或其他对象不能被parsing。 ajax调用预计会得到Json的回报。 试着像这样在控制器中返回JsonResult:

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

希望能帮助到你 :)

你的JSON数据可能是错误的。 http://jsonformatter.curiousconcept.com/来validation它。;

您已经将ajax调用响应数据types指定为:

'JSON'

因为实际的ajax响应不是有效的JSON,因此JSONparsing器会抛出错误。

我build议的最佳方法是将数据types更改为:

'文本'

并在成功callback内validation是否返回有效的JSON,如果JSONvalidation失败,请在屏幕上提醒它,以便明确ajax调用实际上失败的目的。 看看这个:

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

有很多build议要删除

 dataType: "json" 

虽然我承认这是有效的,但却忽视了潜在的问题。 如果您确信返回string确实是JSON,则在响应开始时查找错误的空白。 考虑在小提琴看看它。 矿看起来像这样:

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

在我的情况下,这是PHP喷出不需要的字符(在这种情况下UTF文件的BOM)的问题。 一旦我删除这些问题,同时也解决了问题

 dataType: json 

确保您删除任何可能会输出意外信息的debugging代码或其他任何内容。 有些显而易见,但是现在很容易忘记。

我不知道这是否仍然是实际的,但问题与编码。 更改为ANSI解决了我的问题。

如果你在IE中使用HTTP GET得到这个问题,我通过设置cache:false来解决这个问题。 正如我使用相同的url为HTML和JSON请求它击中caching,而不是做一个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"); } }); 

你应该删除dataType:“json”。 然后看魔术…做这样的事情的原因是,你正在转换json对象为简单的string..所以jsonparsing器不能parsing该string,因为不是一个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"); } }); }; 

从networking.net mvc / api获取操作,确保你得到允许

  return Json(data,JsonRequestBehavior.AllowGet); 

我也得到“请求返回错误:parsererror”。 在JavaScript控制台。 在我的情况下,这不是JSON的问题,但我必须传递到视图文本区域有效的编码。

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

问题

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

我的解决scheme

使用requirejs工具重载JQuery。

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

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> 

如果您不想删除/更改dataType: json ,则可以通过定义自定义converter来覆盖jQuery的严格parsing:

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

使用这个,你可以自定义响应不能被parsing为JSON的行为(即使你得到一个空的响应体!)

使用此自定义转换器,只要请求成功(1xx或2xx响应代码),就会触发.done() / success