Écrire / ajouter des données dans un fichier JSON à l'aide de Node.js


197

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

let jsonFile = require('jsonfile');

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

outPut in loop.json est:

id :1 square : 1

mais je veux un fichier de sortie comme celui-ci (ci-dessous) et aussi si je réexécute ce code, il devrait ajouter cette nouvelle sortie en tant qu'é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);
    }
});

Réponses:


386

Si ce fichier json ne deviendra pas trop volumineux au fil du temps, vous devriez essayer:

  1. Créer un objet javascript avec le tableau de table qu'il contient

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

    obj.table.push({id: 1, square:2});
  3. Convertissez-le d'un objet en chaîne avec 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 lire le fichier json et le reconvertir 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 efficacement pour des données de 100 Mo max. Au-delà de cette limite, vous devez utiliser un moteur de base de données.

METTRE À JOUR:

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 d'un fichier nommé fs.stat (chemin, rappel). Avec cela, vous pouvez vérifier si le fichier existe. Si elle existe, utilisez la fonction de lecture sinon, utilisez la fonction de création. Utilisez la chaîne de date comme chemin d'accès car le fichier sera nommé comme la date d'aujourd'hui + .json. le rappel contiendra un objet stats qui sera nul si le fichier n'existe pas.


1
merci pour la réponse j'ai essayé son fonctionnement mais comment vérifier si un ancien fichier existe puis exécuter le code readlfile sinon exécuter writeFile direct je crée quotidiennement un nouveau fichier avec la date actuelle dans le nom du fichier et je veux que de nouvelles données soient ajoutées dans cet ancien fichier toute la journée lorsque ce code s'exécute
Isoftmaster

1
merci encore une fois j'ai fait fonctionner mon code: D avec tout votre support mais j'ai utilisé la fonction fs.exists ma question mise à jour avec la réponse
Isoftmaster

Ou vous pouvez également utiliser le package jsonfile Node qui encapsule toutes les complexités non affichées dans le code ci-dessus.
Jeach

qu'en est-il si la "table" ou les propriétés de l'objet JSON ne sont pas connues à l'avance ???
Oldboy

@kailniris monsieur comment puis-je mettre à jour un nœud spécifique dans mon fichier json local en angulaire js.ie j'ai un fichier config.json je voulais mettre à jour un nœud spécifique de celui-ci alors comment puis-je faire cela.
theburningfire

23

Veuillez essayer le programme suivant. Vous attendez peut-être cette sortie.

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.

Exécutez ensuite le programme à partir de l'invite de commande à l'aide de la commande node square.js

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

Codage heureux.


11

vous devez lire le fichier, chaque fois que vous souhaitez ajouter une nouvelle propriété au json, puis 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
merci pour la réponse j'ai essayé son fonctionnement mais comment vérifier si un 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 actuelle dans le nom du fichier et je veux que de nouvelles données soient ajoutées ancien fichier toute la journée lorsque ce code s'exécute
Isoftmaster

10

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

8

essayer

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

Pour le formatage, jsonfile donne une spacesoption que vous pouvez passer en paramètre:

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

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

Je ne suggérerais pas d'écrire dans un fichier à chaque fois dans la boucle, mais plutôt de construire l'objet JSON dans la boucle et d'écrire dans un 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);
});

7

Pour une approche synchrone

const fs = require('fs')
fs.writeFileSync('file.json', JSON.stringify(jsonVariable));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.