在Javascript中解析大型JSON数组

Parsing a large JSON array in Javascript

本文关键字:大型 JSON 数组 Javascript      更新时间:2023-09-26

我应该用Javascipt解析一个非常大的JSON数组。它看起来像:

mydata = [
    {'a':5, 'b':7, ... },
    {'a':2, 'b':3, ... },
    .
    .
    .
    ]

现在的问题是,如果我将整个对象传递给我的解析函数parseJSON(),那么它当然可以工作,但它会阻塞选项卡的进程30-40秒(对于包含160000个对象的数组)。

在从服务器请求并解析JSON的整个过程中,我会向用户显示一个"加载"gif。当然,在我调用parse函数后,gif也会冻结,从而导致糟糕的用户体验。我想这次没有办法了,有没有办法(至少)防止加载的gif冻结?

比如每隔几毫秒就对JSON块调用parseJSON()?虽然我是javascript中的一个noob,但我无法实现这一点。

非常感谢,如果你能在这里帮我,我将不胜感激。

您可能需要检查此链接。这是关于多线程的。

基本上:

var url = 'http://bigcontentprovider.com/hugejsonfile';
var f = '(function() {
            send = function(e) { 
                postMessage(e); 
                self.close();
            };
            importScripts("' + url + '?format=json&callback=send");
         })();';
var _blob = new Blob([f], { type: 'text/javascript' });
_worker = new Worker(window.URL.createObjectURL(_blob));
_worker.onmessage = function(e) { 
    //Do what you want with your JSON 
}
_worker.postMessage();

老实说,我自己还没试过。。。

关于可移植性的编辑:Sebastien D.发布了一条带有mdn链接的评论。我刚刚在兼容性部分id中添加了一个ref。

我从未遇到过30-40秒的完整页面锁定,我几乎印象深刻!将数据重组为更小的数据或在服务器端将其拆分为许多文件才是真正的答案。你真的需要每一个小字节的数据吗?

或者,如果你不能更改文件@Cyrill_DD,工作线程的答案将能够为你解析数据并将其发送到你的主JS。不过,这并不像你所猜测的那样是一个完美的解决方案。在两个线程之间传递数据需要对信息进行串行化和重新解释,因此当数据在线程之间传递时,您可能会发现速度明显减慢,如果您试图同时传递所有数据,则会再次回到原点。在工作线程中构建一个查询系统,以便在需要时请求数据块,并使用消息回调可以防止主线程上的解析速度减慢,并允许您在不将数据全部加载到主上下文中的情况下完成对数据的访问。

我应该补充一点,工作线程相对较新,主浏览器支持很好,但移动很糟糕。。。只是提醒一下!