3

使用 jQuery 加载 JSON 提要时报告语法错误的最佳方法是什么?我可以像这样建立错误报告设置:

error: function(xhr){
    alert('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText);
}

但是,当我调用的 URL 加载有效页面(尽管不是其中包含 JSON 对象的页面)时,此函数不会触发。此外,我无法检查它返回的数据,因为(至少根据 Firebug)jQuery.getJSON在将对象传递给执行它的函数之前会在语法错误处中断。

我想报告错误的原因是因为这是我检查用户是否提供了会生成有效 JSON 提要的 URL 的方法。

这是一个相关的答案,需要控制服务器将响应的内容。这是 Firebug 给我 的语法错误 Firebug 给我的语法错误 http://img.skitch.com/20090623-8c97g47jha4mn6adqqtjd41cwy.jpg

有任何想法吗?谢谢

4

4 回答 4

3

您可以将函数绑定到全局 ajaxerror 事件

$(document).ajaxError(function(event, request, ajaxOptions, thrownError){
  if ( 4==request.readyState) { // failed after data has received
    alert(ajaxOptions['url'] + " did not return valid json data");
  }
  else {
    alert("something else wnet wrong");
  }
});
或使用 $.ajax() 而不是 $.getJSON()
function foo() {
  // $.getJSON("http://localhost/test.txt", function(data){});
  $.ajax({
    type: "GET",
    url: "http://localhost/test.txt",
    success: function (data, textStatus) {
      alert("succuess");
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      alert("request failed: " + textStatus);
    },
    dataType: "json"
  });
}

编辑:但是您可能要记住,ajax(dataType:"json")getJSON()(它只是调用 .ajax(dataType:"json") 归结为data = window["eval"]("(" + data + ")")......这可能不是你想要的如果您不知道脚本请求什么(任意)数据。这可以解释为什么当您向其提供 html 文档而不是 json 数据时,firebug 会捕获语法错误。
在这种情况下,最好请求 dataType:"string" 并运行通过成熟的 json 解析器库获取数据。

于 2009-06-23T03:31:05.797 回答
1

感谢所有回答的人。因为我从外部域调用 JSON 提要,所以我不能只使用 jQuery 的 AJAX 功能并将提要作为“文本”而不​​是“json”拉取。jQuery 只允许您从远程源中提取“json”和“script”。

我最终做的是编写一个 PHP 脚本来进行位于我自己的服务器上的外部调用。我使用 jQuery AJAX 调用它,在 URL 中传递请求的源,然后将其作为“文本”抓取。然后我运行自己的检查以确保它的 JSON 格式正确,然后使用另一个库对其进行解析。jQuery 目前不具备解析 JSON 的能力;$.getJSON 仅在您将 URL 传递给它时才有效。

于 2009-07-07T17:02:04.997 回答
0

直接在浏览器的地址栏中调用 URL 或 XHR 请求,查看源代码并将结果粘贴到理解 JavaScript 的 IDE 中。您可能会发现错误的报价或其他内容。

至少你可以删除它的大部分内容,直到你发现有问题的语法,如果没有别的。

于 2009-06-23T03:20:59.233 回答
0

添加到 Diodeus 的答案,将您可能有问题的 JSON 粘贴到此工具中:http: //jsonformatter.curiousconcept.com/

如果你有萤火虫,你甚至可以拼凑出一种以编程方式使用站点服务的方法,尽管这可能会令人不悦。

于 2009-06-23T04:00:26.493 回答