使用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文件不会变得太大,你应该尝试:
-
用table数组创build一个javascript对象
var obj = { table: [] };
-
向它添加一些数据
obj.table.push({id: 1, square:2});
-
将其从一个对象转换为stringifystring
var json = JSON.stringify(obj);
-
使用fs将文件写入磁盘
var fs = require('fs'); fs.writeFile('myjsonfile.json', json, 'utf8', callback);
-
如果你想追加它读取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));