jQuery为ajax请求返回“解析器错误”

IT技术 javascript c# jquery asp.net json
2021-02-08 00:06:01

对于 Ajax 请求,从 jquery 收到“解析器错误”,我尝试将 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)

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() 方法触发错误事件,说“解析器错误”。

6个回答

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

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

方法一

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

方法二

或者您可以通过将数据返回为Json.


parsererror出现消息的原因是,当您简单地返回一个字符串或另一个值时,它并不是真正的Json,因此解析器在解析它时会失败。

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

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

我使用 Rails jquery-ujs 遇到了这个问题
2021-03-18 00:06:01
感谢您的回复,我已经更新了任务的答案,因为这似乎是一个更好的解决方案。
2021-03-28 00:06:01
谢谢!这也适用于 jquery.fileupload.js 和其他使用 JQuery AJAX 方法的库。令人困惑的错误信息!
2021-03-29 00:06:01
当我的 php 脚本出错并且返回非 JSON 数据时,我遇到了这个问题 - 一个有用的禁用建议dataType
2021-04-09 00:06:01
谢谢大卫,方法一对我有用。就我而言,我没有返回任何内容,而是错误地使用了数据类型。谢谢你的提示。
2021-04-11 00:06:01

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

此答案仅使用 file: 协议时jQuery 1.5错误有关

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

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}
我刚遇到这个问题,但我删除了数据类型:'json',问题就解决了。由于它没有返回真正的 json 形式,因此会遇到解析器错误。
2021-03-27 00:06:01
我在 1.7.2 有这个问题:(
2021-03-28 00:06:01
这实际上在文档中: ...The JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} instead. api.jquery.com/jQuery.ajax
2021-03-29 00:06:01
已在 JQuery 1.5.1 中确认修复
2021-03-31 00:06:01
我在 1.9.1 中遇到了这个问题,我通过让我的 API 返回一个空 hash 来解决它{}可惜这是必要的。
2021-04-13 00:06:01

您已将 ajax 调用响应数据类型指定为:

'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);
    }
});
或删除数据类型:)
2021-03-27 00:06:01

问题是您的控制器返回无法解析的字符串或其他对象。ajax 调用期望得到 Json 作为回报。尝试在控制器中像这样返回 JsonResult:

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

    }

希望能帮助到你 :)

抱歉,忘了包含我的代码隐藏,但这正是返回 Json 的方式。
2021-03-19 00:06:01

有很多建议可以删除

dataType: "json"

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

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

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

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

dataType: json
同意。我在我的 json 前面有一个 php deprecated 警告。我正在使用 firefox 控制台来检查内容,它格式化了内容并删除了错误消息。反应看起来不错。有一个开关可以关闭格式化....
2021-04-08 00:06:01
同意这一点......我检查了响应,它是一个 var_dump() 在应用程序的某个地方丢失了。
2021-04-12 00:06:01