使用node.js在JSON文件中写入/添加数据

我正在尝试使用循环数据节点编写JSON文件,例如

var jsonfile = require('jsonfile'); for (i=0; i <11 ; i++){ jsonfile.writeFile('loop.json', "id :" + i + " square :" + i*i); } 

outPut in loop.json是

 id :1 square : 1 

但我想要这样的输出文件(下面),如果我再次运行该代码,它应该添加新的输出作为元素在相同的现有JSON文件

 { "table": [ { "Id ": 1, "square ": 1 }, { "Id ": 2, "square ": 3 }, { "Id ": 3, "square ": 9 }, { "Id ": 4, "square ": 16 }, { "Id ": 5, "square ": 25 }, { "Id ": 6, "square ": 36 }, { "Id ": 7, "square ": 49 }, { "Id ": 8, "square ": 64 }, { "Id ": 9, "square ": 81 }, { "Id ": 10, "square ": 100 } ] } 

我想使用我第一次创build的文件,但是每当我运行代码时,新的元素应该添加在同一个文件中

 var fs = require('fs'); var obj = { table: [] }; fs.exists('myjsonfile.json', function(exists){ if(exists){ console.log("yes file exists"); fs.readFile('myjsonfile.json', function readFileCallback(err, data){ if (err){ console.log(err); } else { obj = JSON.parse(data); for (i=0; i<5 ; i++){ obj.table.push({id: i, square:i*i}); } var json = JSON.stringify(obj); fs.writeFile('myjsonfile.json', json); }}); } else { console.log("file not exists") for (i=0; i<5 ; i++){ obj.table.push({id: i, square:i*i}); } var json = JSON.stringify(obj); fs.writeFile('myjsonfile.json', json); } }); 

如果这个json文件不会变得太大,你应该尝试:

  1. 用table数组创build一个javascript对象

     var obj = { table: [] }; 
  2. 向它添加一些数据

     obj.table.push({id: 1, square:2}); 
  3. 将其从一个对象转换为stringifystring

     var json = JSON.stringify(obj); 
  4. 使用fs将文件写入磁盘

     var fs = require('fs'); fs.writeFile('myjsonfile.json', json, 'utf8', callback); 
  5. 如果你想追加它读取json文件,并将其转换回对象

     fs.readFile('myjsonfile.json', 'utf8', function readFileCallback(err, data){ if (err){ console.log(err); } else { obj = JSON.parse(data); //now it an object obj.table.push({id: 2, square:3}); //add some data json = JSON.stringify(obj); //convert it back to json fs.writeFile('myjsonfile.json', json, 'utf8', callback); // write it back }}); 

这将有效地处理大于100 MB的数据。 超过这个限制,你应该使用数据库引擎。

更新:

创build一个将当前date(年+日+日)作为string返回的函数。 创build名为这个string+ .json的文件。 fs模块有一个可以检查名为fs.stat(path,callback)的文件存在的函数。 有了这个,你可以检查文件是否存在。 如果它不存在,则使用read函数。 使用datestring作为pathcuz文件将被命名为today date + .json。 callback将包含一个stats对象,如果该文件不存在,该对象将为空。

你应该阅读文件,每次你想添加一个新的属性到JSON,然后添加新的属性

 var fs = require('fs'); fs.readFile('data.json',function(err,content){ if(err) throw err; var parseJson = JSON.parse(content); for (i=0; i <11 ; i++){ parseJson.table.push({id:i, square:i*i}) } fs.writeFile('data.json',JSON.stringify(parseJson),function(err){ if(err) throw err; }) }) 

请尝试下面的程序。 你可能会期待这个输出。

 var fs = require('fs'); var data = {} data.table = [] for (i=0; i <26 ; i++){ var obj = { id: i, square: i * i } data.table.push(obj) } fs.writeFile ("input.json", JSON.stringify(data), function(err) { if (err) throw err; console.log('complete'); } ); 

将这个程序保存在一个javascript文件中,比如square.js。

然后使用命令node square.js从命令提示符运行程序

它所做的是,每次执行命令时,只需用新的数据集覆盖现有的文件即可。

快乐的编码。

格式化jsonfile给出spaces选项,你可以作为parameter passing:

  jsonfile.writeFile(file, obj, {spaces: 2}, function (err) { console.error(err); }) 

或者使用jsonfile.spaces = 4 。 在这里阅读详情。

我不会build议每次在循环中写入文件,而是在循环中构buildJSON对象并写入循环外部的文件。

 var jsonfile = require('jsonfile'); var obj={ 'table':[] }; for (i=0; i <11 ; i++){ obj.table.push({"id":i,"square":i*i}); } jsonfile.writeFile('loop.json', obj, {spaces:2}, function(err){ console.log(err); }); 

你也可以导入并使用这个开源的write-json-file组件 。

例:

 const writeJsonFile = require('bit/global/write-json-file'); const jsonFile = "/tmp/exampleFile.json"; writeJsonFile(jsonFile,{isThisReal:ture,author:amit}).catch(err => console.log(err));