запись/добавление данных в файл JSON с помощью узла.Яш

Я пытаюсь написать файл JSON, используя узел из данных цикла например!--5-->

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

вывод в цикле.json is

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

var fs = require('fs');

var 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});
        }
        var 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});
        }
        var json = JSON.stringify(obj);
        fs.writeFile('myjsonfile.json', json);
        }
    });

5 ответов


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

обновление:

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


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

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, а затем добавить новые свойства

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

для форматирования jsonfile дает , который вы можете передать в качестве параметра:

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