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

200

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

let jsonFile = require('jsonfile');

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

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

Я хочу использовать тот же файл, который я создал 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);
    }
});
Isoftmaster
источник

Ответы:

389

Если этот файл 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 МБ. При превышении этого предела вы должны использовать ядро ​​базы данных.

ОБНОВИТЬ:

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

kailniris
источник
1
спасибо за ответ, я попробовал его работу, но как проверить, существует ли старый файл, затем запустите код readlfile, иначе запустите writeFile direct. Я ежедневно создаю новый файл с текущей датой в имени файла и хочу, чтобы новые данные добавлялись в этот старый файл весь день когда этот код запускается
Isoftmaster
1
спасибо еще раз, я сделал мой код работающим: D со всей вашей поддержкой, но я использовал функцию fs.exists, мой вопрос обновлен ответом
Isoftmaster
Или вы также можете использовать пакет Node jsonfile , который охватывает все сложности, не показанные в коде выше.
Джич
что делать, если «таблица» или свойства объекта JSON не известны заранее ???
старик
@ kailniris сэр, как я могу обновить определенный узел в моем локальном файле json в угловом js.ie у меня есть файл config.json, я хотел обновить его, а затем как я могу это сделать.
theburningfire
25

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

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

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

Удачного кодирования.

Джейкоб Нельсон
источник
12

Вы должны читать файл, каждый раз, когда вы хотите добавить новое свойство в 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;
  })
})
Zamboney
источник
1
спасибо за ответ, я попробовал его работу, но как проверить, существует ли старый файл, затем запустите код readlfile, иначе запустите writeFile direct, чтобы создать новый файл. Я создаю ежедневно новый файл с текущей датой в имени файла, и я хочу добавить в него новые данные. старый файл весь день, когда запускается этот код
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);
});
avck
источник
7

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

const fs = require('fs')
fs.writeFileSync('file.json', JSON.stringify(jsonVariable));
Нироджан Сельванатан
источник