为了账号安全,请及时绑定邮箱和手机立即绑定

在Node.js中解析大型JSON文件

在Node.js中解析大型JSON文件

慕妹3242003 2019-11-25 10:36:28
我有一个文件,该文件以JSON形式存储许多JavaScript对象,我需要读取该文件,创建每个对象并对其进行处理(在我的情况下,将它们插入到db中)。JavaScript对象可以表示为以下格式:格式A:[{name: 'thing1'},....{name: 'thing999999999'}]或格式B:{name: 'thing1'}         // <== My choice....{name: 'thing999999999'}请注意,...表示很多JSON对象。我知道我可以将整个文件读入内存,然后JSON.parse()像这样使用:fs.readFile(filePath, 'utf-8', function (err, fileContents) {  if (err) throw err;  console.log(JSON.parse(fileContents));});但是,该文件可能真的很大,我希望使用流来完成此操作。我在流中看到的问题是,文件内容随时可能被分解成数据块,那么如何JSON.parse()在此类对象上使用?理想情况下,每个对象将被读取为一个单独的数据块,但是我不确定如何做到这一点。var importStream = fs.createReadStream(filePath, {flags: 'r', encoding: 'utf-8'});importStream.on('data', function(chunk) {    var pleaseBeAJSObject = JSON.parse(chunk);               // insert pleaseBeAJSObject in a database});importStream.on('end', function(item) {   console.log("Woot, imported objects into the database!");});*/注意,我希望防止将整个文件读入内存。时间效率对我来说并不重要。是的,我可以尝试一次读取多个对象并一次插入所有对象,但这是性能上的调整-我需要一种方法来确保不会引起内存过载,无论文件中包含多少个对象。我可以选择使用,FormatA或者选择FormatB其他方式,只需在您的答案中指定即可。谢谢!
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

正如我以为编写流式JSON解析器会很有趣一样,我也认为也许应该快速搜索一下是否已有一个可用的。


原来有。


JSONStream “流式JSON.parse和字符串化”

自从我找到它以来,我显然没有使用过它,因此我无法评论它的质量,但是我很想知道它是否有效。


考虑以下Javascript并可以正常工作_.isString:


stream.pipe(JSONStream.parse('*'))

  .on('data', (d) => {

    console.log(typeof d);

    console.log("isString: " + _.isString(d))

  });

如果流是对象数组,则将记录对象进入时的状态。因此,唯一要缓冲的是一次仅一个对象。


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 1370 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信