【发布时间】:2012-08-06 03:04:57
【问题描述】:
我有一个以 JSON 格式存储许多 JavaScript 对象的文件,我需要读取该文件,创建每个对象,并对它们进行处理(在我的情况下将它们插入数据库)。 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 或其他方式,请在您的回答中说明。谢谢!
【问题讨论】:
-
对于格式 B,您可以解析块中的新行,并提取每一整行,如果它在中间切断,则连接其余行。不过可能有更优雅的方式。我对流的使用并不多。
标签: javascript json file node.js