Schreiben / Hinzufügen von Daten in eine JSON-Datei mit Node.js.

196

Ich versuche, eine JSON-Datei mit einem Knoten aus Schleifendaten zu schreiben, z.

let jsonFile = require('jsonfile');

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

outPut in loop.json ist:

id :1 square : 1

Ich möchte jedoch eine Ausgabedatei wie diese (siehe unten). Wenn ich diesen Code erneut ausführe, sollte diese neue Ausgabe als Elemente in derselben vorhandenen JSON-Datei hinzugefügt werden:

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

Ich möchte dieselbe Datei verwenden, die ich zum ersten Mal erstellt habe, aber jedes Mal, wenn ich diesen Code ausführe, sollten neue Elemente in derselben Datei hinzugefügt werden

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
quelle

Antworten:

386

Wenn diese JSON-Datei im Laufe der Zeit nicht zu groß wird, sollten Sie Folgendes versuchen:

  1. Erstellen Sie ein Javascript-Objekt mit dem darin enthaltenen Tabellenarray

    var obj = {
       table: []
    };
  2. Fügen Sie einige Daten hinzu, wie

    obj.table.push({id: 1, square:2});
  3. Konvertieren Sie es mit stringify von einem Objekt in einen String

    var json = JSON.stringify(obj);
  4. Verwenden Sie fs, um die Datei auf die Festplatte zu schreiben

    var fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', callback);
  5. Wenn Sie es anhängen möchten, lesen Sie die JSON-Datei und konvertieren Sie sie zurück in ein Objekt

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

Dies funktioniert effektiv für Daten mit einer maximalen Größe von 100 MB. Über dieser Grenze sollten Sie ein Datenbankmodul verwenden.

AKTUALISIEREN:

Erstellen Sie eine Funktion, die das aktuelle Datum (Jahr + Monat + Tag) als Zeichenfolge zurückgibt. Erstellen Sie die Datei mit dem Namen string + .json. Das fs-Modul verfügt über eine Funktion, die die Existenz von Dateien mit dem Namen fs.stat (Pfad, Rückruf) überprüfen kann. Damit können Sie überprüfen, ob die Datei vorhanden ist. Wenn es existiert, verwenden Sie die Lesefunktion, wenn dies nicht der Fall ist, verwenden Sie die Erstellungsfunktion. Verwenden Sie die Datumszeichenfolge als Pfad, da die Datei als heutiges Datum + .json bezeichnet wird. Der Rückruf enthält ein Statistikobjekt, das null ist, wenn die Datei nicht vorhanden ist.

Kailniris
quelle
1
danke für die antwort ich habe versucht zu funktionieren, aber wie man prüft, ob eine alte datei existiert, dann readlfile code ausführen, sonst writeFile direct ausführen, ich erstelle täglich eine neue datei mit dem aktuellen datum im dateinamen und ich möchte, dass neue daten den ganzen tag in dieser alten datei hinzugefügt werden wenn dieser Code ausgeführt wird
Isoftmaster
1
Nochmals vielen Dank, ich habe meinen Code zum Laufen gebracht: D mit all Ihrer Unterstützung, aber ich habe die Funktion fs.exists verwendet. Meine Frage wurde mit Antwort aktualisiert
Isoftmaster
Sie können auch das Paket jsonfile Node verwenden, das alle im obigen Code nicht gezeigten Komplexitäten umschließt .
Jeach
Was ist, wenn die "Tabelle" oder die Eigenschaften des JSON-Objekts nicht im Voraus bekannt sind?
Oldboy
@kailniris Sir, wie kann ich einen bestimmten Knoten in meiner lokalen JSON-Datei in Angular JS aktualisieren? Ich habe eine config.json-Datei. Ich wollte einen bestimmten Knoten davon aktualisieren. Wie kann ich das tun?
theburningfire
23

Bitte versuchen Sie das folgende Programm. Möglicherweise erwarten Sie diese Ausgabe.

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

Speichern Sie dieses Programm in einer Javascript-Datei, z. B. square.js.

Führen Sie dann das Programm an der Eingabeaufforderung mit dem Befehl aus node square.js

Dabei wird die vorhandene Datei bei jeder Ausführung des Befehls einfach mit einem neuen Datensatz überschrieben.

Viel Spaß beim Codieren.

Jacob Nelson
quelle
11

Sie sollten die Datei jedes Mal lesen, wenn Sie dem json eine neue Eigenschaft hinzufügen möchten, und dann die neuen Eigenschaften hinzufügen

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
quelle
1
danke für die antwort ich habe versucht zu funktionieren, aber wie man prüft, ob eine alte datei vorhanden ist, dann readlfile code ausführen, sonst writeFile direkt ausführen, um eine neue datei zu erstellen ich erstelle täglich eine neue datei mit dem aktuellen datum im dateinamen und ich möchte, dass neue daten hinzugefügt werden alte Datei den ganzen Tag, wenn dieser Code ausgeführt wird
Isoftmaster
10

Das obige Beispiel ist auch korrekt, aber ich gebe ein einfaches Beispiel:

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
quelle
8

Versuchen

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

quelle
7

Zum Formatieren gibt jsonfile eine spacesOption an, die Sie als Parameter übergeben können:

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

Oder verwenden jsonfile.spaces = 4. Details hier lesen .

Ich würde nicht empfehlen, jedes Mal in der Schleife in eine Datei zu schreiben, sondern das JSON-Objekt in der Schleife zu erstellen und in eine Datei außerhalb der Schleife zu schreiben.

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

Für synchronen Ansatz

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