【问题标题】:jQuery returning "parsererror" for ajax requestjQuery为ajax请求返回“parsererror”
【发布时间】:2011-06-30 23:38:09
【问题描述】:

从 jquery 获取 Ajax 请求的“解析器错误”,我尝试将 POST 更改为 GET,以几种不同的方式(创建类等)返回数据,但我似乎无法弄清楚是什么问题是。

我的项目在 MVC3 中,我使用的是 jQuery 1.5 我有一个下拉菜单,在 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() 方法的错误事件,说“parsererror”。

【问题讨论】:

  • 它是在控制台中触发 javascript 错误还是 $.ajax() 命令的“错误”处理函数被执行?
  • 对不起,应该更具体,它会触发 $.ajax() 错误函数 { alert("Error"); }
  • 有机会获得实时链接吗?你看到你在 Firebug 中显示的 JSON 数据了吗?
  • 不,我没有实时链接。但是是的,这就是 Firebug 中显示的 JSON 响应。
  • 是的,我的错是错字。修复了问题

标签: javascript c# jquery asp.net json


【解决方案1】:

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

此答案仅在使用文件时与bug with jQuery 1.5 相关:协议。

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

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

【讨论】:

  • 确认已在 JQuery 1.5.1 中修复
  • 我在 1.7.2 中遇到了这个问题 :(
  • 我只是遇到了这个问题,但我删除了 datatype: 'json' 并且问题解决了。由于它没有返回真正的 json 格式,因此会遇到解析器错误。
  • 我在 1.9.1 中遇到了这个问题,我通过让我的 API 返回一个空哈希 {} 来解决这个问题。可惜这是必要的。
  • 这其实在文档中:...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
【解决方案2】:

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

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

    }

希望对你有帮助:)

【讨论】:

  • 抱歉,忘记包含我的代码隐藏,但这正是 Json 的返回方式。
【解决方案3】:

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

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

方法一

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

方法二

或者您可以按照@Sagiv 所说的方式将您的数据返回为Json


之所以会出现这个parsererror消息,是因为当你只是简单地返回一个字符串或者另一个值时,它并不是真正的Json,所以解析器在解析的时候失败了。

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

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

【讨论】:

  • 感谢大卫,方法一为我工作。就我而言,我没有返回任何东西,而是错误地使用了数据类型。感谢您的提示。
  • 感谢您的回复,我已经更新了任务的答案,因为这似乎是一个更好的解决方案。
  • 当我的 php 脚本出错并返回非 JSON 数据时,我遇到了这个问题 - 禁用 dataType indeed 的有用建议!
  • 谢谢!这也适用于 jquery.fileupload.js 和其他使用 JQuery AJAX 方法的库。令人困惑的错误消息!
  • 我在使用 Rails jquery-ujs 时遇到了这个问题
【解决方案4】:

问题

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 tool重载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>

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          如果您在 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");
              }
          });
          

          【讨论】:

            【解决方案9】:

            有很多建议要删除

            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() 在应用程序的某个地方丢失了。
            • 同意。 Ich 在我的 json 前面有一个 php deprecated 警告。我正在使用 Firefox 控制台检查内容,它格式化了东西并取出了错误消息。反应看起来不错。有一个开关可以关闭格式....
            【解决方案10】:

            您应该删除数据类型:“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");
                }
             });
            };
            

            【讨论】:

              【解决方案11】:

              如果从 web .net mvc/api 获取操作,请确保您允许获取

                   return Json(data,JsonRequestBehavior.AllowGet);
              

              【讨论】:

                【解决方案12】:

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

                【讨论】:

                • 或删除数据类型:)
                【解决方案13】:

                如果你不想删除/更改dataType: json,你可以通过定义一个自定义的converter来覆盖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

                【讨论】:

                  【解决方案14】:

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

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

                  【讨论】:

                    【解决方案15】:

                    我遇到了这样的错误,但是在将响应发送给客户端之前修改了我的响应后它工作正常。

                    //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
                    }
                    

                    【讨论】:

                      【解决方案16】:

                      我有同样的问题,原来我的web.config 和我的队友不一样。 所以请检查你的web.config

                      希望这对某人有所帮助。

                      【讨论】:

                        【解决方案17】:

                        我遇到了同样的问题。我发现解决我的问题的方法是确保使用双引号而不是单引号。

                        echo "{'error':'Sorry, your file is too large. (Keep it under 2MB)'}";
                        -to-
                        echo '{"error":"Sorry, your file is too large. (Keep it under 2MB)"}';
                        

                        【讨论】:

                        • OP实际上使用了双引号,是吗?
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-08-14
                        • 1970-01-01
                        • 2020-04-23
                        相关资源
                        最近更新 更多