【问题标题】:Write / add data in JSON file using Node.js使用 Node.js 在 JSON 文件中写入/添加数据
【发布时间】:2021-09-18 00:54:51
【问题描述】:

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

let jsonFile = require('jsonfile');

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

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
      }
   ]
}

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

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

【问题讨论】:

    标签: javascript json node.js fs


    【解决方案1】:

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

    更新:

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

    【讨论】:

    • 或者您也可以使用jsonfile Node 包,它包含了上面代码中未显示的所有复杂性。
    【解决方案2】:

    我同意上述答案,这是一个完整的读写示例,供任何需要的人使用。

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

    【讨论】:

      【解决方案3】:

      对于同步方法

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

      【讨论】:

        【解决方案4】:

        试试

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

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

            或使用jsonfile.spaces = 4。阅读详情here

            我不建议每次在循环中写入文件,而是在循环中构造 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);
            });
            

            【讨论】:

              【解决方案7】:

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

              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从命令提示符运行程序

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

              快乐编码。

              【讨论】:

                【解决方案8】:

                你应该阅读文件,每次你想向 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;
                  })
                })
                

                【讨论】:

                • 感谢回复我尝试了它的工作,但是如何检查旧文件是否存在然后运行 ​​readlfile 代码,否则直接运行 writeFile 以创建新文件我正在创建带有当前日期的每日新文件,并且我希望在此代码运行时整天将新数据添加到该旧文件中
                猜你喜欢
                • 2023-01-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-11-28
                • 2017-12-16
                相关资源
                最近更新 更多