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

我试图写JSON文件使用节点从循环数据,例如:

let jsonFile = require('jsonfile');


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

循环输出。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
}
]
}

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

const fs = require('fs');


let 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
});
}


let 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
});
}


let json = JSON.stringify(obj);
fs.writeFile('myjsonfile.json', json);
}
});
671980 次浏览

你应该读取文件,每次你想要添加一个新的属性到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运行程序

它所做的是,每次执行命令时,简单地用一组新数据覆盖现有文件。

快乐的编码。

如果这个JSON文件不会随着时间的推移变得太大,你应该尝试:

  1. 创建一个包含表格数组的JavaScript对象

    var obj = {
    table: []
    };
    
  2. 添加一些数据,例如:

    obj.table.push({id: 1, square:2});
    
  3. 将其从对象转换为带有JSON.stringify的字符串

    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的数据。超过这个限制,您应该使用数据库引擎。

更新:

创建一个函数,返回当前日期(年+月+日)为字符串。创建名为this string + .json的文件。fs模块有一个函数,可以检查名为fs的文件是否存在。回调,stat(路径)。 有了它,您可以检查文件是否存在。如果存在,则使用read函数,如果不存在,则使用create函数。使用日期字符串作为路径,因为文件将被命名为今天的日期+ .json。回调将包含一个stats对象,如果文件不存在,该对象将为空

对于格式化jsonfile,提供了spaces选项,您可以将其作为参数传递:

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

或者使用jsonfile.spaces = 4。读取详细信息在这里

我不建议每次都在循环中写入文件,而是在循环中构造JSON对象并在循环外写入文件。

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);
});

上面的例子也是正确的,但我提供了简单的例子:

var fs = require("fs");
var sampleObject = {
name: 'pankaj',
member: 'stack',
type: {
x: 11,
y: 22
}
};


fs.writeFile("./object.json", JSON.stringify(sampleObject, null, 4), (err) => {
if (err) {
console.error(err);
return;
};
console.log("File has been created");
});

试一试

var fs = require("fs");
var sampleObject = { your data };


fs.writeFile("./object.json", JSON.stringify(sampleObject, null, 4), (err) => {
if (err) {  console.error(err);  return; };
console.log("File has been created");
});

对于同步方法

const fs = require('fs')
fs.writeFileSync('file.json', JSON.stringify(jsonVariable));

我同意以上的答案,这是一个完整的阅读和写作的样本,任何人都需要它。

     router.post('/', function(req, res, next) {


console.log(req.body);
var id = Math.floor((Math.random()*100)+1);


var tital = req.body.title;
var description = req.body.description;
var mynotes = {"Id": id, "Title":tital, "Description": description};
        

fs.readFile('db.json','utf8', function(err,data){
var obj = JSON.parse(data);
obj.push(mynotes);
var strNotes = JSON.stringify(obj);
fs.writeFile('db.json',strNotes, function(err){
if(err) return console.log(err);
console.log('Note added');
});


})
        

        

});




  

基于承诺的解决方案[Javascript (ES6) + Node.js (V10或以上)]

写入文件:

const fsPromises = require('fs').promises;
fsPromises.writeFile('myFile.json', JSON.stringify({ name: "Sridhar", salary: 1234 }))
.then( () => { console.log('JSON saved'); })
.catch(er => { console.log(er);});

附加到文件:

const fsPromises = require('fs').promises;
fsPromises.readFile('myFile.json', 'utf8')
.then(data => {
let json = JSON.parse(data);
json.myArr.push({name: "Krishnan", salary: 5678});


fsPromises.writeFile('myFile.json', JSON.stringify(json))
.then(  () => { console.log('Append Success'); })
.catch(err => { console.log("Append Failed: " + err);});
})
.catch(err => { console.log("Read Error: " +err);});

如果你的项目支持Javascript ES8,那么你可以使用asyn /等待来代替本机promise。