3

我正在尝试从我的服务器获取一些 JSON 数据,如下所示:

var a = $.ajax({
    url: "data.json",
    dataType: 'json',
    data: null,
    error: function(data) {
        console.log("error");
    },
    success: function(data) {
        console.log("success");
    }
});

当我这样做时,该error函数被调用(error打印到控制台)。

不过,奇怪的是,当我检查时,a我发现已返回正确的响应文本。

a

readyState: 4
responseText: "contents of data.json!"
status: 200
statusText: "OK"

这是怎么回事?如果请求成功,为什么不触发成功回调?

4

2 回答 2

4

可能是因为返回的特定值不是您指定的类型。响应本身是成功的(通过查看“a”的详细信息可以看到),但这并不是执行成功还是错误的唯一决定因素。您将 json 指定为“dataType”(返回类型),但收到了一个字符串。对于测试,这很好,但正如您所见,事情不会按预期运行。如果您不指定 dataType 选项,jQuery 将尝试通过查看 mime 类型和响应的内容来确定返回的内容类型。当它们不匹配时(如您的情况),这是一个错误。

更新:

我意识到我在上面的解释中漫无目的。尽管您似乎解决了问题,但让我再次详细说明。

在您的情况下发生错误的可能性有多种。需要理解的重要一点是,如果您设置“dataType”,jQuery 将尝试使用该类型解析 responseText。如果您没有设置该选项,它会相应地猜测和解析它(这意味着它会查看 MIME 类型)并以这种方式解析它。如果指定“dataType”,responseText 需要为 JSON 格式。因此,如果您指定“json”,但提供一个字符串(在您的情况下),jQuery 解析将失败。如果不指定“dataType”,jQuery 猜测,responseText 需要匹配 MIME 类型。因此,当 MIME 类型为“application/json”时,您无法返回字符串。当事情不匹配时,就会发生错误。

希望这会有所帮助!

于 2012-06-22T03:55:19.733 回答
1

只是一种预感,但是返回的内容类型是“application/json”吗?我的预感是错误是 JSON 应该返回,但它返回的文本/html(或其他一些内容类型)然后没有被解析。

于 2012-06-22T03:56:17.627 回答