Запись / добавление данных в файл JSON с помощью Node.js

#javascript #node.js #visual-studio-code #save #adventure

Вопрос:

Я пытаюсь написать файл 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
      }
   ]
}
 

Я хочу использовать тот же файл, который я создал 1-й раз, но всякий раз, когда я запускаю этот код, в тот же файл должны добавляться новые элементы

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

Ответ №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 МБ. Сверх этого предела вам следует использовать компонент database engine.

Обновить:

Создайте функцию, которая возвращает текущую дату (год месяц день) в виде строки. Создайте файл с именем этой строки .json. модуль fs имеет функцию, которая может проверять наличие файла с именем fs.stat(путь, обратный вызов). С помощью этого вы можете проверить, существует ли файл. Если он существует, используйте функцию чтения, если его нет, используйте функцию создания. Используйте строку даты в качестве пути, потому что файл будет называться сегодняшней датой .json. обратный вызов будет содержать объект статистики, который будет равен нулю, если файл не существует.

Комментарии:

1. спасибо за ответ, я попробовал его работу, но как проверить, существует ли старый файл, затем запустите код readlfile, иначе запустите файл записи напрямую, я ежедневно создаю новый файл с текущей датой в имени файла, и я хочу, чтобы новые данные добавлялись в этот старый файл весь день, когда этот код запускается

2. еще раз спасибо, я заставил свой код работать 😀 при всей вашей поддержке, но я использовал функцию fs.существует, мой вопрос обновлен ответом

3. Или вы также можете использовать пакет узла jsonfile, в который заключены все сложности, не показанные в приведенном выше коде.

4. что делать, если «таблица» или свойства объекта JSON не известны заранее ???

5. @kailniris, сэр, как я могу обновить определенный узел в своем локальном файле json в angular js.то есть у меня есть файл конфигурации.json, который я хотел обновить, затем как я могу это сделать.

Ответ №2:

Пожалуйста, попробуйте следующую программу. Возможно, вы ожидаете такого результата.

 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

Что он делает, так это просто перезаписывает существующий файл новым набором данных каждый раз, когда вы выполняете команду.

Счастливого Кодирования.

Ответ №3:

пробовать

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

Комментарии:

1. Спасибо за красивую печатную версию!

Ответ №4:

вы должны читать файл каждый раз, когда хотите добавить новое свойство в 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, иначе запустите файл записи напрямую, чтобы создать новый файл, я ежедневно создаю новый файл с текущей датой в имени файла, и я хочу, чтобы новые данные добавлялись в этот старый файл весь день, когда этот код запускается

Ответ №5:

Для синхронного подхода

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

Ответ №6:

Приведенный выше пример также верен, но я привожу простой пример:

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

Ответ №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);
});
 

Ответ №8:

Я согласен с приведенными выше ответами, вот полный образец чтения и записи для всех, кому это нужно.

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

        })
        
        
    });