Tulis / tambahkan data dalam file JSON menggunakan Node.js

196

Saya mencoba menulis file JSON menggunakan node dari data loop, misalnya:

let jsonFile = require('jsonfile');

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

outPut di loop.json adalah:

id :1 square : 1

tapi saya ingin file output seperti ini (di bawah) dan juga jika saya menjalankan kode itu lagi itu harus menambahkan output baru sebagai elemen dalam file JSON yang sama:

{
   "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
      }
   ]
}

Saya ingin menggunakan file yang sama yang saya buat pertama kali tetapi setiap kali saya menjalankan kode itu elemen baru harus ditambahkan dalam file yang sama

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
sumber

Jawaban:

386

Jika file json ini tidak menjadi terlalu besar, Anda harus mencoba:

  1. Buat objek javascript dengan array tabel di dalamnya

    var obj = {
       table: []
    };
    
  2. Tambahkan beberapa data ke dalamnya

    obj.table.push({id: 1, square:2});
  3. Konversikan dari objek ke string dengan stringify

    var json = JSON.stringify(obj);
  4. gunakan fs untuk menulis file ke disk

    var fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', callback);
    
  5. jika Anda ingin menambahkannya baca file json dan mengubahnya kembali menjadi objek

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

Ini akan bekerja untuk data sebesar 100 MB maks secara efektif. Lebih dari batas ini, Anda harus menggunakan mesin basis data.

MEMPERBARUI:

Buat fungsi yang mengembalikan tanggal saat ini (tahun + bulan + hari) sebagai string. Buat file dengan nama string ini + .json. modul fs memiliki fungsi yang dapat memeriksa keberadaan file bernama fs.stat (path, callback). Dengan ini, Anda dapat memeriksa apakah file tersebut ada. Jika ada, gunakan fungsi baca jika tidak, gunakan fungsi buat. Gunakan string tanggal sebagai jalur karena file akan dinamai tanggal hari ini + .json. panggilan balik akan berisi objek statistik yang akan menjadi nol jika file tidak ada.

kailniris
sumber
1
terima kasih atas balasan saya mencoba kerjanya tetapi bagaimana memeriksa apakah file lama ada kemudian jalankan kode readlfile lain jalankan writeFile langsung saya membuat file baru setiap hari dengan tanggal saat ini dalam nama file dan saya ingin data baru ditambahkan dalam file lama itu sepanjang hari saat kode ini dijalankan
Isoftmaster
1
terima kasih sekali lagi saya membuat kode saya berfungsi: D dengan semua dukungan Anda tetapi saya menggunakan fs.exists berfungsi pertanyaan saya diperbarui dengan jawaban
Isoftmaster
Atau Anda juga dapat menggunakan paket Node jsonfile yang membungkus semua kompleksitas yang tidak ditampilkan dalam kode di atas.
Jeach
bagaimana jika "tabel" atau properti dari objek JSON tidak diketahui sebelumnya ???
oldboy
@kailniris Pak bagaimana saya bisa memperbarui node tertentu dalam file json lokal saya di js.ie sudut saya punya file config.json saya ingin memperbarui node spesifik itu lalu bagaimana saya bisa melakukan itu.
api pembakaran
23

Silakan coba program berikut ini. Anda mungkin mengharapkan output ini.

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

Simpan program ini dalam file javascript, katakanlah, square.js.

Kemudian jalankan program dari command prompt menggunakan perintah node square.js

Apa yang dilakukannya adalah, cukup menimpa file yang ada dengan set data baru, setiap kali Anda menjalankan perintah.

Selamat Coding.

Jacob Nelson
sumber
11

Anda harus membaca file, setiap kali Anda ingin menambahkan properti baru ke json, dan kemudian menambahkan properti baru

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
sumber
1
terima kasih atas balasan saya mencoba kerjanya tetapi bagaimana memeriksa apakah file lama ada kemudian jalankan kode readlfile lain jalankan writeFile langsung untuk membuat file baru saya membuat file baru setiap hari dengan tanggal saat ini dalam nama file dan saya ingin data baru ditambahkan di dalamnya file lama sepanjang hari saat kode ini dijalankan
Isoftmaster
10

Contoh di atas juga benar, tetapi saya memberikan contoh sederhana:

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");
});
Pankaj Chauhan
sumber
8

mencoba

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

sumber
7

Untuk memformat jsonfile memberikan spacesopsi yang dapat Anda berikan sebagai parameter:

   jsonfile.writeFile(file, obj, {spaces: 2}, function (err) {
         console.error(err);
   })

Atau gunakan jsonfile.spaces = 4. Baca detail di sini .

Saya tidak akan menyarankan menulis ke file setiap kali dalam loop, sebagai gantinya membangun objek JSON dalam loop dan menulis ke file di luar loop.

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
sumber
7

Untuk pendekatan yang sinkron

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