jQuery为ajax请求返回“ parsererror”


186

我一直在从jquery收到针对Ajax请求的“ parsererror”,我尝试将POST更改为GET,以几种不同的方式(创建类等)返回数据,但是我似乎无法弄清楚问题出在哪里。

我的项目在MVC3中,我使用的是jQuery 1.5,我有一个Dropdown,并且在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”。


会在控制台中触发javascript错误,还是执行$ .ajax()命令的“错误”处理函数?
arnorhs 2011年

抱歉,应该更具体一些,它会触发$ .ajax()错误函数{alert(“ Error”); }
dkarzon 2011年

有机会进行实时链接吗?您看到Firebug中显示的JSON数据了吗?
Pekka

不,我没有实时链接。但是,是的,这就是Firebug中显示的JSON响应。
dkarzon

是的,我的错是错字。解决了问题
dkarzon 2011年

Answers:


306

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

我用一种简单得多的方法解决了它。

方法一

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

方法二

或者,您可以通过将数据返回为来执行@Sagiv所说的Json


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

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

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


4
谢谢大卫,方法一为我工作。就我而言,我没有返回任何东西,只是错误地使用了数据类型。谢谢你的提示。
克里希纳·特雅·维拉玛卡尼尼

感谢您的答复,我已经更新了任务的答案,因为这似乎是一个更好的解决方案。
dkarzon 2014年

当我的php脚本出现错误并且返回非JSON数据时,我遇到了这个问题-禁用此功能的有用建议dataType
沙拉德2014年

谢谢!这也适用于使用JQuery AJAX方法的jquery.fileupload.js和其他库。令人困惑的错误消息!
kqr

我使用Rails jquery-ujs遇到了这个问题
Donato

29

有关正确的方法,请参阅@ 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;
        //...
    }
}

1
证实在固定的JQuery 1.5.1
johnhunter

13
我在1.7.2中
遇到了

6
我只是遇到了这个问题,但是我删除了数据类型:“ json”,问题就解决了。由于它没有返回真正的json格式,因此它将遇到解析器错误。
David East

3
我在1.9.1中遇到这个问题,并且通过让我的API返回一个空hash来解决了这个问题{}。羞耻这是必要的。
亚当·塔特尔

4
这实际上在文档中: ...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
Rob Rob

17

您已将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);
    }
});

1
或删除数据类型:)
亚历山大

10

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

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

    }

希望能帮助到你 :)


抱歉,忘了在后面加上我的代码,但这就是Json的返回方式。
dkarzon 2011年


4

有很多建议要删除

dataType: "json"

虽然我认为这行得通,但它忽略了潜在的问题。如果您确信返回字符串确实是JSON,请在响应开始时查找错误的空格。考虑在提琴手中看看它。我的看起来像这样:

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

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

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

dataType: json

同意这一点...我检查了响应,这是一个var_dump()在应用程序中丢失的地方。
查克(Chuck)

2

确保删除所有调试代码或任何其他可能输出意外信息的内容。有些明显,但此刻很容易忘记。



0

如果您在IE中使用HTTP GET遇到此问题,我将通过设置缓存来解决此问题:false。当我对HTML和json请求使用相同的url时,它命中了缓存,而不是进行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");
    }
});

0

您应该删除dataType:“ json”。然后看魔术……做这种事情的原因是您正在将json对象转换为简单的字符串..因此json分析器由于不是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");
    }
 });
};


0

我还收到“请求返回错误:parsererror。” 在javascript控制台中。在我看来,这不是Json的问题,但是我必须将有效的编码传递给视图文本区域。

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

0

我遇到了这样的错误,但在修改响应后再将其发送给客户端,就可以正常工作。

//Server side
response = JSON.stringify('{"status": {"code": 200},"result": '+ JSON.stringify(result)+'}');
res.send(response);  // Sending to client

//Client side
success: function(res, status) {
    response = JSON.parse(res); // Getting as expected
    //Do something
}


-1

问题

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>

我的解决方案

使用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>

-1

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

$.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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.