7

我正在创建一个允许用户以 JSON 格式加载数据的 Web 应用程序。我目前正在使用以下函数来读取我保存在本地磁盘上的 JSON 文件:

function retrieveJSON(url, callback)
{
  // this is needed because FireFox tries to parse files as XML
  $.ajaxSetup({ mimeType: "text/plain" });

  // send out an AJAX request and return the result
  $.getJSON(url, function(response) {
    console.log("Data acquired successfully");
    callback(response);
  }).error(function(jqXHR, textStatus, errorThrown) {
    console.log("Error...\n" + textStatus + "\n" + errorThrown);
  });
}

这非常适用于格式良好的 JSON 数据。但是,对于格式错误的数据,控制台日志会显示以下内容:

Error...
parsererror
SyntaxError: JSON.parse: unexpected character

这几乎完全没有帮助,因为它没有告诉我意外的字符是什么或可以找到它的行号。我可以使用 JSON 验证器来更正本地磁盘上的文件,但是当页面从 Web 上的远程 URL 加载文件时,这不是一个选项。

如何获取任何错误的位置?如果可能,我想获得令牌,但我至少需要获得行号。有一个项目要求向用户显示 JSON 代码的摘录并突出显示发生任何错误的行。

我目前正在使用 jQuery,但 jQuery 不是项目要求,因此如果另一个 API 或 JSON 解析器提供此功能,我可以改用它。

4

2 回答 2

3

是的,有最后期限的生活从来都不是一件容易的事:)。

这可能会对您有所帮助,经过几个小时的谷歌搜索,我在 Git Hub 上找到了 jsonlint 。它看起来很有希望,它包含一个可以在服务器端使用的shell 脚本,并且它的浏览器 JavaScript版本似乎正是您正在寻找的。

希望这会对您有所帮助。

于 2012-12-01T07:02:10.200 回答
0

我同意有期限的生活是艰难的。我非常高兴我不必忍受最后期限,我是我自己的老板。

所以为了寻找更好的解决这个问题的方法,我想出了以下方法:

...
        readConfig : function () {
            jQuery.ajax({
                type : 'GET',
                url : 'config.json',
                success : function (data, ts, xhr) {
                    var d = JSON.parse(data);
                },
                error : function (xhr, ajaxOptions, thrownError) {
                    if (typeof thrownError.message=='string') {
                        // ./config.json contains invalid data.
                        var 
                        text = xhr.responseText,
                        pos = parseInt(thrownError.message.match(/position (\d+)/)[1]),
                        html = text.substr(0,pos)+'<span style="color:red;font-weight:bold;">__'+text.substr(pos,1)+'__</span>'+text.substr(pos+1, text.length-pos-1);
                        cm.install.displayErrorMsg('Could not read ./config.json :(<br/>'+thrownError+'<br/>'+html);
                    } else {
                        cm.install.displayErrorMsg('Error retrieving ./config.json<br/>HTTP error code : '+xhr.status);
                    };
                }
            });
        },
...
于 2020-11-16T06:41:21.230 回答