Scrivi / aggiungi dati nel file JSON usando Node.js


200

Sto cercando di scrivere un file JSON usando il nodo dai dati del loop, ad esempio:

let jsonFile = require('jsonfile');

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

outPut in loop.json è:

id :1 square : 1

ma voglio un file di output come questo (sotto) e anche se eseguo nuovamente quel codice, dovrei aggiungere quel nuovo output come elementi nello stesso file JSON esistente:

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

Voglio usare lo stesso file che ho creato la prima volta, ma ogni volta che eseguo quel codice nuovi elementi dovrebbero aggiungere nello stesso file

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

Risposte:


389

Se questo file json non diventerà troppo grande nel tempo, dovresti provare:

  1. Crea un oggetto javascript con l'array table in esso

    var obj = {
       table: []
    };
  2. Aggiungi alcuni dati ad esso come

    obj.table.push({id: 1, square:2});
  3. Converti da un oggetto a stringa con stringify

    var json = JSON.stringify(obj);
  4. usa fs per scrivere il file su disco

    var fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', callback);
  5. se si desidera aggiungerlo, leggere il file JSON e convertirlo nuovamente in un oggetto

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

Questo funzionerà efficacemente per dati grandi fino a 100 MB. Oltre questo limite, è necessario utilizzare un motore di database.

AGGIORNARE:

Creare una funzione che restituisce la data corrente (anno + mese + giorno) come stringa. Crea il file chiamato questa stringa + .json. il modulo fs ha una funzione che può controllare l'esistenza del file chiamato fs.stat (percorso, callback). Con questo, puoi verificare se il file esiste. Se esiste, utilizzare la funzione di lettura in caso contrario, utilizzare la funzione di creazione. Usa la stringa della data come percorso perché il file verrà chiamato come data odierna + .json. il callback conterrà un oggetto stats che sarà nullo se il file non esiste.


1
grazie per la risposta ho provato a farlo funzionare ma come verificare se esiste un vecchio file quindi esegui il codice readlfile altrimenti esegui writeFile direct Sto creando ogni giorno un nuovo file con la data corrente nel nome del file e voglio nuovi dati da aggiungere in quel vecchio file tutto il giorno quando viene eseguito questo codice
Isoftmaster,

1
grazie ancora una volta ho fatto funzionare il mio codice: D con tutto il vostro supporto ma ho usato fs.exists funzione la mia domanda aggiornata con risposta
Isoftmaster

Oppure puoi anche usare il pacchetto jsonfile Node che racchiude tutte le complessità non mostrate nel codice sopra.
Jeach

che dire se la "tabella" o le proprietà dell'oggetto JSON non sono conosciute in anticipo ???
Vecchio

@kailniris signore come posso aggiornare un nodo specifico nel mio file json locale in angular js.ie Ho un file config.json che volevo aggiornare un nodo specifico di esso, quindi come posso farlo.
theburningfire

25

Si prega di provare il seguente programma. Potresti aspettarti questo risultato.

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

Salvare questo programma in un file javascript, ad esempio square.js.

Quindi eseguire il programma dal prompt dei comandi utilizzando il comando node square.js

Ciò che fa è semplicemente sovrascrivere il file esistente con un nuovo set di dati, ogni volta che si esegue il comando.

Happy Coding.


12

dovresti leggere il file ogni volta che vuoi aggiungere una nuova proprietà al json e quindi aggiungere le nuove proprietà

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
grazie per la risposta ho provato a farlo funzionare ma come verificare se esiste un vecchio file quindi esegui il codice readlfile altrimenti esegui writeFile direttamente per creare un nuovo file Sto creando ogni giorno un nuovo file con la data corrente nel nome del file e voglio aggiungere nuovi dati in quello vecchio file tutto il giorno in cui viene eseguito questo codice
Isoftmaster,

10

L'esempio sopra è anche corretto, ma fornisco un semplice esempio:

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

provare

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

Per la formattazione jsonfile fornisce spacesun'opzione che puoi passare come parametro:

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

Oppure usa jsonfile.spaces = 4. Leggi i dettagli qui .

Non consiglierei di scrivere ogni volta nel ciclo, ma costruisco l'oggetto JSON nel ciclo e scrivo sul file al di fuori del ciclo.

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

7

Per approccio sincrono

const fs = require('fs')
fs.writeFileSync('file.json', JSON.stringify(jsonVariable));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.