我有一些我想定期写入文件的数据,我想把它写成小JSON对象。稍后我想全部阅读它们以进行处理,但JSON对象的附加文件本身并不是JSON。
所以我将JSON对象字符串化并定期将它们写入文件,我得到类似的东西;
{
"100": {
"stuff": 123
}
}
{
"300": {
"stuff": 456
}
}
{
"200": {
"stuff": 789
}
}
当然,当我尝试使用如下的简单脚本解析文件时;
var fs = require('fs');
var file = 'test.log'
var obj = JSON.parse(fs.readFileSync(file, 'utf8'));
var fs = require('fs');
var obj;
fs.readFile(file, 'utf8', function (err, data) {
if (err) throw err;
obj = JSON.parse(data);
console.log(obj);
});
...解析器吓坏了,因为这不是一个有效的JSON文件,我需要更多的东西;
{
"100": {
"stuff": 123
},
"300": {
"stuff": 456
},
"200": {
"stuff": 789
}
}
...但我无法通过添加记录来获得此功能。我当然可以在写之前在记录之间强制使用逗号,但我最终错过了' {'在文件的开头,'}'在文件的末尾,将有一个额外的','在最后一条记录上。整个事情都成了一个混乱。
我猜测某人已经完成了所有这些工作并且有一个很好的模式,但我无法从搜索中找到任何东西。每个部分都有不同数量的数据,所以我喜欢JSON提供的灵活性,但我不想在写入磁盘之前提前存储它,因为它会变大。
如果你能为我指出一个很好的解决方案,我们将不胜感激。
真诚的,保罗。
答案 0 :(得分:2)
为什么在处理对象列表文件以添加逗号之前不使用正则表达式。由于模式是每个对象之后的新行,因此您可以使用它来查找和替换:/}\n{/g
。
对于您的样本,这应该可以解决问题:
var fs = require('fs');
var file = 'test.log'
var obj;
fs.readFile(file, 'utf8', function (err, data) {
if (err) throw err;
var jsonString = '[' + data.replace(/}\n{/g, '},{')+ ']'; // Adding brackets in order to create an array of objects
obj = JSON.parse(jsonString);
console.log(obj);
});

然后,如果你想拥有一个你指定的对象,你可以使用扩展运算符...
将一个对象附加到你的超级对象:
var fs = require('fs');
var file = 'test.log'
var obj;
fs.readFile(file, 'utf8', function (err, data) {
if (err) throw err;
var jsonString = '[' + data.replace(/}\n{/g, '},{')+ ']'; // Adding brackets in order to creat an array of objects
obj = JSON.parse(jsonString);
var superObj = {};
for (var i = 0; i < obj.length; i++) {
superObj = {...superObj,...obj[i]};
}
console.log(superObj);
});
&#13;