Запишіть / додайте дані у файл JSON за допомогою Node.js


199

Я намагаюся записати файл 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);
    }
});

Відповіді:


388

Якщо цей файл 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. зворотний виклик буде містити об'єкт статистики, який буде нульовим, якщо файл не існує.


1
дякую за відповідь, я спробував її роботу, але як перевірити, чи існує старий файл, то запустіть код readlfile, ще запустіть writeFile direct, я створюю новий щоденний новий файл із поточною датою у назві файлу, і я хочу, щоб нові дані додавались у цей старий файл цілий день при запуску цього коду
Isoftmaster

1
дякую ще раз, я змусив свій код працювати: D при всій вашій підтримці, але я використовував функцію fs.exists, моє питання оновлено відповіддю
Isoftmaster

Або ви також можете використовувати пакет jsonfile Node, який містить усі складності, не показані в наведеному вище коді.
Jeach

а як бути, якщо "таблиця" або властивості об'єкта JSON не відомі заздалегідь ???
oldboy

@kailniris сер, як я можу оновити конкретний вузол у моєму локальному файлі json у кутовому js.ie, у мене є файл config.json, я хотів оновити конкретний вузол, то як це зробити.
палаючий пожежа

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

1
дякую за відповідь, я спробував свою роботу, але як перевірити, чи існує старий файл, то запустіть код readlfile інакше запустіть writeFile безпосередньо, щоб створити новий файл, я створюю новий щоденний новий файл з поточною датою в імені файлу, і я хочу, щоб нові дані були додані в цьому старий файл цілий день, коли цей код працює
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);
});

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.