将JSON数据附加到文件

时间:2018-05-28 09:37:48

标签: json file

我有一些我想定期写入文件的数据,我想把它写成小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提供的灵活性,但我不想在写入磁盘之前提前存储它,因为它会变大。

如果你能为我指出一个很好的解决方案,我们将不胜感激。

真诚的,保罗。

1 个答案:

答案 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;
&#13;
&#13;