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


196

我正在尝试使用来自循环数据的节点来写入JSON文件,例如:

let jsonFile = require('jsonfile');

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

loop.json中的outPut是:

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

Answers:


386

如果随着时间的推移该json文件不会变得太大,您应该尝试:

  1. 创建一个具有表数组的javascript对象

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

    obj.table.push({id: 1, square:2});
  3. 使用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的数据。超过此限制,您应该使用数据库引擎。

更新:

创建一个函数,该函数以字符串形式返回当前日期(年+月+日)。创建名为此字符串+ .json的文件。fs模块具有一个功能,该功能可以检查名为fs.stat(path,callback)的文件是否存在。这样,您可以检查文件是否存在。如果存在,则使用read函数;如果不存在,则使用create函数。使用日期字符串作为路径,因为文件将被命名为今天日期+ .json。回调将包含一个stats对象,如果该文件不存在,则该对象为null。


1
感谢您的答复,我尝试了它的工作原理,但是如何检查是否存在旧文件,然后运行readlfile代码,否则运行writeFile直接,我正在使用文件名中的当前日期创建每日新文件,我希望整天将新数据添加到该旧文件中当此代码运行时
Isoftmaster

1
再次感谢您,我在所有支持下使我的代码工作:D,但我使用fs.exists函数将我的问题更新为答案
Isoftmaster

或者,您也可以使用jsonfile Node程序包,该程序包包装了上面代码中未显示的所有复杂性。
Jeach

如果事先不知道JSON对象的“表”或属性该怎么办?
老男孩

@kailniris先生,我如何在angular js中更新本地json文件中的特定节点,即我有一个config.json文件,我想更新其特定节点,然后该怎么做。
燃烧的火焰

23

请尝试以下程序。您可能期望此输出。

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

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

编码愉快。


11

每次要将新属性添加到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;
  })
})

1
感谢您的答复,我尝试了它的工作原理,但是如何检查是否存在旧文件,然后运行readlfile代码,否则运行writeFile直接创建新文件,我正在使用文件名中的当前日期创建每日新文件,我希望在其中添加新数据这段代码运行的全天文件
Isoftmaster

10

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

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

8

尝试

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

7

为了格式化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);
});

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.