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

新手上路,请多包涵

我正在尝试使用来自循环数据的节点编写 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);
    }
});

原文由 Isoftmaster 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

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

  1. 创建一个包含表数组的 JavaScript 对象
var obj = {
 table: []
 };

  1. 向其中添加一些数据,例如:
 obj.table.push({id: 1, square:2});

  1. 使用 JSON.stringify 将其从对象转换为字符串
var json = JSON.stringify(obj);

  1. 使用 fs 将文件写入磁盘
var fs = require('fs');
 fs.writeFile('myjsonfile.json', json, 'utf8', callback);

  1. 如果要附加它,请读取 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。回调将包含一个统计对象,如果文件不存在,该对象将为空。

原文由 kailniris 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 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

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

快乐编码。

原文由 Jacob Nelson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题