jQuery为ajax请求返回"parsererror"

dka*_*zon 172 javascript c# asp.net jquery json

从jquery获取Ajax请求的"parsererror",我尝试将POST更改为GET,以几种不同的方式返回数据(创建类等),但我似乎无法弄清问题是什么.

我的项目在MVC3中,我正在使用jQuery 1.5我有一个Dropdown,在onchange事件中,我根据所选内容启动调用以获取一些数据.

下拉列表:(这会从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)
Run Code Online (Sandbox Code Playgroud)

使用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");
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

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

[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"},
 {"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]
Run Code Online (Sandbox Code Playgroud)

但是jquery会触发$ .ajax()方法的错误事件,说"parsererror".

Dav*_*ast 284

我最近遇到了这个问题并偶然发现了这个问题.

我用一种更容易的方式解决了这个问题.

方法一

您可以dataType: 'json'从对象文字中删除该属性...

方法二

或者你可以通过返回你的数据来做@Sagiv所说的Json.


parsererror发生此消息的原因是,当您只是返回一个字符串或另一个值时,它实际上并不是Json,因此解析器在解析时会失败.

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

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

  • 谢谢大卫,方法一为我工作.在我的情况下,我没有返回任何东西,但错误地使用了数据类型.谢谢你的提示. (4认同)

joh*_*ter 27

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

这个答案仅使用file:protocol时jQuery 1.5错误有关.

最近升级到jQuery 1.5时我遇到了类似的问题.尽管获得了正确的响应,但错误处理程 我通过使用complete事件然后检查状态值来解决它.例如:

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

  • 我在1.7.2中有这个问题:( (13认同)
  • 我刚刚遇到这个问题,但我删除了数据类型:'json',问题解决了.由于它没有返回一个真正的形式一个json它会遇到一个解析器错误. (6认同)
  • 这实际上在文档中:`... JSON数据以严格的方式解析; 任何格式错误的JSON都会被拒绝,并抛出一个解析错误.从jQuery 1.9开始,空响应也被拒绝; 服务器应返回null或{}的响应.http://api.jquery.com/jQuery.ajax/ (4认同)
  • 我在1.9.1中遇到了这个问题,我通过让我的API返回一个空哈希`{}`来解决这个问题.羞耻这是必要的. (3认同)

Nad*_*han 16

您已将ajax调用响应dataType指定为:

'JSON'

其中实际的ajax响应不是有效的JSON,因此JSON解析器抛出错误.

我建议的最佳方法是将dataType更改为:

'文本'

并且在成功回调中验证是否返回了有效的JSON,如果JSON验证失败,则在屏幕上提醒它,以便明确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);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 或删除数据类型:) (2认同)

Sag*_*fek 10

问题是你的控制器返回无法解析的字符串或其他对象.ajax调用有望让Json得到回报.尝试在控制器中返回JsonResult,如下所示:

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

    }
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)


Sam*_*han 7

有很多建议可以删除

dataType: "json"
Run Code Online (Sandbox Code Playgroud)

虽然我承认这是有效的,但它忽略了潜在的问题。如果您确信返回字符串确实是 JSON,那么在响应的开头查找错误的空格。考虑在 fiddler 中查看它。我的看起来像这样:

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

{"type":"scan","data":{"image":".\/output\/ou...
Run Code Online (Sandbox Code Playgroud)

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

dataType: json
Run Code Online (Sandbox Code Playgroud)


Vis*_*ria 5

您的JSON数据可能有误.http://jsonformatter.curiousconcept.com/验证它.