44

$.getJSON当返回的数据不是有效的 JSON 时,jQuery 静默失败似乎很不方便。为什么这是以静默失败的方式实现的?以更好的失败行为执行 getJSON 的最简单方法是什么(例如抛出异常console.log(),或其他)?

4

5 回答 5

88

您可以使用

        function name() {
            $.getJSON("", function(d) {
                alert("success");
            }).done(function(d) {
                alert("done");
            }).fail(function(d) {
                alert("error");
            }).always(function(d) {
                alert("complete");
            });
        }

如果要查看错误原因,请使用完整版

function name() {
    $.getJSON("", function(d) {
        alert("success");
    }).fail( function(d, textStatus, error) {
        console.error("getJSON failed, status: " + textStatus + ", error: "+error)
    });
}

如果您的 JSON 格式不正确,您将看到类似

getJSON failed, status: parsererror, error: SyntaxError: JSON Parse error: Unrecognized token '/'

如果 URL 错误,您将看到类似

getJSON failed, status: error, error: Not Found

如果您尝试从另一个域获取 JSON,违反了同源策略,此方法将返回一条空消息。请注意,您可以使用 JSONP(有其局限性)或跨域资源共享 ( CORS ) 的首选方法来解决同源策略。

于 2012-04-27T14:01:45.307 回答
29

直接来自文档:

重要提示:从 jQuery 1.4 开始,如果 JSON 文件包含语法错误,请求通常会静默失败。

正如文档页面所说,getJSON 只是一种简写方法

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback
});

要获得失败行为,您可以像这样使用 $.ajax:

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback,
    error: another callback
});
于 2011-03-30T21:48:37.163 回答
3

您可以$.ajax改用,并将dataType选项设置为“json”。从文档中:

“json”:将响应评估为 JSON 并返回一个 JavaScript 对象。在 jQuery 1.4 中,JSON 数据以严格的方式解析;拒绝任何格式错误的 JSON并引发解析错误。(有关正确的 JSON 格式的更多信息,请参阅 json.org。)

于 2011-03-30T21:48:22.197 回答
0

你应该看看这个 API 的文档......它上面有一个 .error 。

http://api.jquery.com/jQuery.getJSON/

于 2011-03-30T21:48:17.683 回答
0

如果您请求 JSONP 作为响应,如果没有响应(例如网络中断),您将获得静默失败。有关详细信息,请参阅此线程

于 2016-01-13T17:41:08.447 回答