javascript - 如何使用 Node.js writeStream 将 JSON 数组写入文件?

标签 javascript json node.js fs node-streams

我编写了一个 Node.js 脚本来从网站上抓取数据,我在该网站上迭代页面以提取结构化数据。

我为每个页面提取的数据是对象数组的形式。

我认为我可以使用 fs.createWriteStream() 方法创建一个可写流,在每次页面提取后我可以在该流上增量写入数据。

显然,你只能将字符串或缓冲区写入流,所以我正在做这样的事情:

output.write(JSON.stringify(operations, null, 2));

但最后,一旦我关闭流,JSON 就会格式错误,因为显然我只是一个接一个地附加每个页面的每个数组,结果如下所示:

[
    { ... },  /* data for page 1 */
    { ... }
][ /* => here is the problem */
    { ... },  /* data for page 2 */
    { ... }
]

我如何才能将数组实际附加到输出中而不是链接它们?真的可行吗?

最佳答案

你的选择是......

  1. 将完整数组保留在内存中,仅在处理完所有页面后才写入最后的 json 文件。
  2. 单独编写每个对象,并手动处理方括号和逗号。

类似这样的事情...

//start processing
output.write('[');
//loop through your pages, however you're doing that
while (more_data_to_read()) {
    //create "operation" object
    var operation = get_operation_object();
    output.write(JSON.stringify(operation, null, 2));
    if (!is_last_page()) {
        //write out comma to separate operation objects within array
        output.write(',');
    }
}
//all done, close the json array
output.write(']');

这将创建格式良好的 json。

就我个人而言,我会选择#1,因为这似乎是更“正确”的方法。如果您担心数组使用太多内存,那么 json 可能不是数据文件的最佳选择。它不是特别适合非常大的数据集。

在上面的代码示例中,如果进程中途中断,那么您将得到一个无效的 json 文件,因此渐进式写入实际上不会使应用程序更具容错性。

关于javascript - 如何使用 Node.js writeStream 将 JSON 数组写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48442773/

相关文章:

javascript - 使用 javascript 根据选定的组合框动态更改图像

java - 在 Facebook Graph API 中解析的数据不足

c# - 使用 JSON.NET 将 C# 对象转换为 JSON 时出现额外的 '\'

sql-server - 使用 Entity Framework 发布 Web API 时出错

javascript - 为什么它有效 -> key : 'hey' ->'hey' and doesnt throw any error?

javascript - 如何使用 Mongoose 更新具有未知数量可能字段的 MongoDB 集合

javascript - Express body-parser req.body with formdata 是空对象

javascript - 通过 onClick 选择选项

javascript - 未终止的字符串常量-mshta :javascript

javascript - Node.js:请求页面并允许页面在抓取之前构建