【问题标题】:jQuery: JSON.parse doesn't work for a long JSON stringjQuery:JSON.parse 不适用于长 JSON 字符串
【发布时间】:2013-09-18 10:04:02
【问题描述】:

我正在从服务器下载一个大文本文件到 phonegap 应用程序。文本是字符串形式的有效 JSON。我将文本数据写入设备的文件系统,然后再读取。我使用文件阅读器获取文本数据,这似乎工作正常。当我解析字符串 JSON 时,就会出现问题。

当我下载一个包含 2500 个元素(从数据库返回并以 json 格式返回的记录)的文本文件时,JSON.parse(stringJSON) 函数可以正常工作并返回一个 JSON 对象,但是如果我增加从服务器到 3000 然后我没有响应,json 输出似乎格式正确。看起来像内存问题,JSON数据最多1.5MB,使用jquery的JSON.parse解析太多了,带有phonegap。我查看了this 页面并尝试包含 parse_json 而不是 JSON.parse,但它仍然没有返回任何内容(我在我的页面中包含了相关脚本)。

var ft = new FileTransfer();

 ft.onprogress = function(progressEvent) {
    if (progressEvent.lengthComputable) {
        var perc = Math.abs(Math.floor((progressEvent.loaded / progressEvent.total) * 100));
        $loading.html(perc + " Loading...")
    } else {
        if($loading.innerHTML == "") {
            $loading.innerHTML = "Loading";
        } else {
            $loading.innerHTML += ".";
        }
    }
};

var dlPath = DATADIR_separate.fullPath + "/"+foldername_separate+".html";
ft.download("http://downloadURL", dlPath, function(){
    alert('saved');
    $loading.hide();
    remove_permanent_overlay();
}, function(){
    alert('fail');
    $loading.hide();
    remove_permanent_overlay();
});

然后在所有文件阅读器回调之后:

function readAsText_READ(file) {
var reader = new FileReader();

reader.onloadend = function(evt) {
    alert('loaded');//this fires, so filereader is working
    //alert(evt.target.result);//this alerts even with a large string
    //var parseTarget = JSON.parse(evt.target.result);//works for smaller strings fails with larger strings
    console.log('parsing now...');
    var parseTarget = json_parse(evt.target.result);//same result as JSON.parse
    console.log(parseTarget);
    //var parseTarget = $.parseJSON( evt.target.result );
    //var parseTarget = eval( "("+evt.target.result+")" );
    //alert(parseTarget);
    alert(parseTarget["879"]);
};

reader.readAsText(file);
//reader.readAsDataURL(file)
alert('reading file: '+file);

}

*编辑 在 phonegap 的 weinre 调试器中,当我尝试读取大的 json 字符串时,我得到以下信息。

parsing...
processMessage failed: Message: S01 File1238321490
s{"really long json... jsonetc..."}
processMessage failed: Error: [object Object]
processMessage failed: Stack: undefined

不太清楚这些错误消息是什么意思,我会尝试找出...

任何帮助将不胜感激。

【问题讨论】:

  • 不显示错误信息很难猜。
  • 抱歉,我已经使用从 weinre 控制台获得的输出编辑了我的问题,不确定它有多大帮助。
  • 您应该捕捉到json_parse 抛出的错误,例如与try { var parseTarget = json_parse(evt.target.result); } catch( e ) { console.dir(e) } 一起查看它是否是解析器以及它显示的消息。
  • 我尝试了try catch,得到了完全相同的错误信息,没有额外的错误输出到控制台,所以我猜这意味着json_parse没有问题?
  • 如果没有前面的代码,就不容易分辨。如果调用json_parse 不会引发错误,那么问题似乎出在其他地方。你的console.log(parseTarget); 可能会失败吗?

标签: jquery json cordova


【解决方案1】:

只是为了结束:

我减小了要下载的文件的大小,但我愚蠢地忘记了将从服务器发送到移动应用程序的内容转义,因此它接收到了无效的 JSON。这很难发现,因为 JSON 中的前几千个条目是有效的,字符串后面有一些恶意双引号。

我从服务器中转义了内容,并轻松地解析了一个 300kb 文件中的 JSON。我很确定 1MB 的文件也可以正常工作。

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 2022-01-14
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多