我有一个很大的json文件,它是以换行符分隔的JSON,其中多个标准JSON对象由额外的换行符分隔,例如。
{'name':'1','age':5}
{'name':'2','age':3}
{'name':'3','age':6}
我现在在node.js中使用JSONStream来解析一个大的json文件,我使用JSONStream的原因是因为它是基于流的。
但是,示例中的两种解析语法都不能帮助我解析每行都包含分隔JSON的json文件
var parser = JSONStream.parse(**['rows', true]**);
var parser = JSONStream.parse([**/./**]);
有人能帮我吗
5条答案
按热度按时间6kkfgxo01#
警告:自从这个答案被写出来后,JSONStream库的作者removed the emit root event functionality,显然是为了修复一个内存泄漏。如果您需要emit root功能,您可以使用0.x.x版本。
以下为未修改的原始答案:
来自自述文件:
JSONStream.parse(path)
path
应该是属性名、RegExps、布尔值和/或函数的数组。任何与路径匹配的对象都将以'data'
的形式发出。当接收到所有数据时,将发出
'root'
事件。'root'
事件传递根对象&匹配对象的计数。在您的例子中,由于您希望返回JSON对象而不是特定的属性,因此您将使用
'root'
事件,并且不需要指定路径。你的代码可能看起来像这样:
mwecs4sa2#
JSONstream用于解析单个巨大的JSON对象,而不是许多JSON对象。您希望在换行符处拆分流,然后将其解析为JSON。
NPM包split声称可以进行这种拆分,甚至有一个特性可以为您解析JSON行。
cu6pst1q3#
如果您的文件不够大,这里有一个简单但不高性能的解决方案:
zf9nrax14#
我创建了一个包
@jsonlines/core
,它将jsonlines解析为对象流。你可以试试下面的代码:
注意,
parseStream
是标准节点双工流。所以你也可以使用for await ... of
或其他方式来使用它。nimxete25#
当文件小到可以放入内存时,这里有另一个解决方案。它一次读取整个文件,通过在换行符处拆分(删除末尾的空行)将其转换为数组,然后解析每行。