确定JSON解析错误的位置

确定JSON解析错误的位置,json,parsing,numbers,line,Json,Parsing,Numbers,Line,我正在创建一个web应用程序,允许用户以JSON格式加载数据。我目前正在使用以下函数读取保存在本地磁盘上的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 t

我正在创建一个web应用程序,允许用户以JSON格式加载数据。我目前正在使用以下函数读取保存在本地磁盘上的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解析器提供此功能,我可以使用它。

是的,有期限的生活从来都不容易:)

这可能会帮助你,在谷歌搜索了几个小时后,我在GitHub上找到了。它看起来很有希望,它包括一个可以在服务器端使用的版本,并且有一个版本似乎正是您所寻找的


希望这能对你有所帮助。

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

因此,为了更好地解决这个问题,我提出了以下建议:

...
        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);
                    };
                }
            });
        },
...
。。。
readConfig:function(){
jQuery.ajax({
键入:“GET”,
url:'config.json',
成功:函数(数据、ts、xhr){
var d=JSON.parse(数据);
},
错误:函数(xhr、ajaxOptions、thrownError){
if(thrownError.message的类型=='string'){
//./config.json包含无效数据。
变量
text=xhr.responseText,
pos=parseInt(thrownError.message.match(/position(\d+/)[1]),
html=text.substr(0,pos)+”text.substr(pos,1)+”text.substr(pos+1,text.length-pos-1);
cm.install.displayErrorMsg('无法读取./config.json:(
'+thrownError+'
'+html); }否则{ cm.install.displayErrorMsg('Error retrieving./config.json
HTTP错误代码:'+xhr.status); }; } }); }, ...
好吧,截止日期前没有回复,这让人沮丧。出于绝望,我发现eval()会告诉你行号,所以我用它作为占位符。不幸的是,eval()没有与JSON解析器相同的保护措施。但项目负责人并不关心这一点,因此占位符已成为实现——这是一个问题,因为我们正在从外部源加载JSON。因此,现在该页面存在安全漏洞,我被指责花了太长时间来解决“简单问题”,并且我被责骂放弃了“无关关注点”的任务。这看起来确实很有希望。谢谢!我不确定什么时候可以将此代码替换为当前正在使用的代码,但我肯定会在第一次机会时检查它。