245 votes

Écrire / ajouter des données dans un fichier JSON en utilisant Node.js

J'essaie d'écrire un fichier JSON en utilisant le nœud à partir des données de la boucle, par exemple :

let jsonFile = require('jsonfile');

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

outPut dans loop.json est :

id :1 square : 1

mais je veux un fichier de sortie comme celui-ci (ci-dessous) et aussi si j'exécute ce code à nouveau, il devrait ajouter cette nouvelle sortie comme éléments dans le même fichier JSON existant :

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

Je veux utiliser le même fichier que j'ai créé la première fois, mais chaque fois que j'exécute ce code, de nouveaux éléments doivent être ajoutés dans ce même fichier.

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

476voto

kailniris Points 3000

Si ce fichier JSON ne devient pas trop gros avec le temps, vous devriez essayer :

  1. Créez un objet JavaScript contenant le tableau de la table.

    var obj = {
       table: []
    };
  2. Ajoutez-y des données, par exemple :

    obj.table.push({id: 1, square:2});
  3. Convertissez-le d'un objet à une chaîne de caractères avec JSON.stringify

    var json = JSON.stringify(obj);
  4. Utiliser fs pour écrire le fichier sur le disque

    var fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', callback);
  5. Si vous voulez l'ajouter, lisez le fichier JSON et reconvertissez-le en objet.

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

Cela fonctionnera pour les données qui ne dépassent pas 100 Mo effectivement. Au-delà de cette limite, vous devez utiliser un moteur de base de données.

UPDATE :

Créez une fonction qui renvoie la date actuelle (année+mois+jour) sous forme de chaîne. Créez le fichier nommé cette chaîne + .json. Le module fs a une fonction qui peut vérifier l'existence du fichier nommée fs.stat(path, callback). Avec cette fonction, vous pouvez vérifier si le fichier existe. S'il existe, utilisez la fonction read ; s'il n'existe pas, utilisez la fonction create. Utilisez la chaîne date comme chemin car le fichier sera nommé comme la date du jour + .json. Le callback contiendra un objet stats qui sera nul si le fichier n'existe pas.

1 votes

Merci pour la réponse, j'ai essayé, cela fonctionne, mais comment vérifier si l'ancien fichier existe, puis exécuter le code readlfile, sinon exécuter writeFile directement, je crée quotidiennement un nouveau fichier avec la date du jour dans le nom du fichier et je veux que les nouvelles données soient ajoutées dans cet ancien fichier toute la journée lorsque ce code est exécuté.

1 votes

merci encore une fois, j'ai réussi à faire fonctionner mon code :D grâce à votre aide mais j'ai utilisé la fonction fs.exists ma question a été mise à jour avec la réponse

1 votes

Ou vous pouvez également utiliser le jsonfile Le paquet Node qui englobe toutes les complexités qui n'apparaissent pas dans le code ci-dessus.

40voto

J Nelson Points 81

Veuillez essayer le programme suivant. Vous devez vous attendre à ce résultat.

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

Enregistrez ce programme dans un fichier javascript, disons, square.js.

Ensuite, exécutez le programme à partir de l'invite de commande en utilisant la commande node square.js

Ce qu'il fait, c'est simplement écraser le fichier existant avec un nouvel ensemble de données, chaque fois que vous exécutez la commande.

Bon codage.

15voto

Zamboney Points 1496

vous devriez lire le fichier, chaque fois que vous voulez ajouter une nouvelle propriété à la json, et ensuite ajouter les nouvelles propriétés

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 votes

Merci pour la réponse, j'ai essayé, cela fonctionne mais comment vérifier si l'ancien fichier existe, puis exécuter le code readlfile, sinon exécuter writeFile directement pour créer un nouveau fichier. Je crée quotidiennement un nouveau fichier avec la date du jour dans le nom du fichier et je veux que les nouvelles données soient ajoutées dans cet ancien fichier toute la journée lorsque ce code est exécuté.

12voto

Pankaj Chauhan Points 21

L'exemple ci-dessus est également correct, mais je fournis un exemple simple :

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

9voto

avck Points 1648

Pour le formatage, le fichier json donne spaces que vous pouvez passer en tant que paramètre :

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

Ou utilisez jsonfile.spaces = 4 . Lire les détails ici .

Je ne suggère pas d'écrire dans le fichier à chaque fois dans la boucle, mais plutôt de construire l'objet JSON dans la boucle et d'écrire dans le fichier en dehors de la boucle.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X