一直从jquery获得一个Ajax请求的“parsererror”,我已经尝试将POST更改为GET,以几种不同的方式返回数据(创建类等),但我似乎无法找出问题是什么。

我的项目是在MVC3和我使用jQuery 1.5 我有一个下拉菜单,在onchange事件上,我触发了一个调用,以获得基于所选内容的一些数据。

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

@{
    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,那么请在响应的开头寻找错误的空白。考虑在《提琴手》中看看它。我的是这样的:

Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"type":"scan","data":{"image":".\/output\/ou...

在我的情况下,这是一个问题,PHP喷涌出不需要的字符(在这种情况下UTF文件bom)。一旦我删除了这些,它修复了问题,同时也保持

dataType: json

其他回答

我还得到了“请求返回错误:parsererror.”在javascript控制台。 在我的情况下,这不是Json的问题,但我必须传递给视图文本区域一个有效的编码。

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

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

您的JSON数据可能是错误的。http://jsonformatter.curiousconcept.com/来验证它。

如果你不想删除/更改dataType: json,你可以通过定义一个自定义转换器来覆盖jQuery的严格解析:

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

    ...

使用它,您可以自定义当响应不能解析为JSON时的行为(即使您得到一个空的响应体!)

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

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

我用一种更简单的方法解决了这个问题。

方法一

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

两个方法

或者你也可以像@Sagiv所说的那样,将数据返回为Json。


发生此parsererror消息的原因是,当您只是返回一个字符串或另一个值时,它不是真正的Json,因此解析器在解析它时失败。

因此,如果您删除dataType: json属性,它将不会尝试将其解析为json。

使用另一种方法,如果您确保将数据返回为Json,解析器将知道如何正确处理它。