Escribir / agregar datos en un archivo JSON usando Node.js

197

Estoy tratando de escribir un archivo JSON usando el nodo de datos de bucle, por ejemplo:

let jsonFile = require('jsonfile');

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

outPut in loop.json es:

id :1 square : 1

pero quiero un archivo de salida como este (a continuación) y también si ejecuto ese código nuevamente, debería agregar esa nueva salida como elementos en el mismo archivo JSON existente:

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

Quiero usar el mismo archivo que creé la primera vez, pero cada vez que ejecuto ese código, deben agregarse nuevos elementos en ese mismo archivo

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
fuente

Respuestas:

386

Si este archivo json no se vuelve demasiado grande con el tiempo, debería intentarlo:

  1. Cree un objeto javascript con la matriz de la tabla.

    var obj = {
       table: []
    };
  2. Agregue algunos datos como

    obj.table.push({id: 1, square:2});
  3. Conviértalo de un objeto a una cadena con stringify

    var json = JSON.stringify(obj);
  4. use fs para escribir el archivo en el disco

    var fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', callback);
  5. si desea agregarlo, lea el archivo json y conviértalo de nuevo en un objeto

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

Esto funcionará para datos de hasta 100 MB como máximo de manera efectiva. Sobre este límite, debe usar un motor de base de datos.

ACTUALIZAR:

Cree una función que devuelva la fecha actual (año + mes + día) como una cadena. Cree el archivo llamado esta cadena + .json. el módulo fs tiene una función que puede verificar la existencia de un archivo llamado fs.stat (ruta, devolución de llamada). Con esto, puede verificar si el archivo existe. Si existe, use la función de lectura, si no es así, use la función de creación. Use la cadena de fecha como la ruta porque el archivo se nombrará como la fecha de hoy + .json. la devolución de llamada contendrá un objeto de estadísticas que será nulo si el archivo no existe.

kailniris
fuente
1
gracias por la respuesta, probé su funcionamiento, pero cómo verificar si existe un archivo antiguo y luego ejecutar el código readfile; de ​​lo contrario, ejecutar writeFile direct. cuando se ejecuta este código
Isoftmaster
1
gracias una vez más, hice que mi código funcionara: D con todo su apoyo pero utilicé la función fs.exists mi pregunta se actualizó con la respuesta
Isoftmaster
O también puede usar el paquete Nodo jsonfile que envuelve todas las complejidades que no se muestran en el código anterior.
Jeach
¿qué pasa si la "tabla" o las propiedades del objeto JSON no se conocen de antemano ???
oldboy
@kailniris señor, ¿cómo puedo actualizar un nodo específico en mi archivo json local en angular js.ie tengo un archivo config.json que quería actualizar un nodo específico de él, entonces cómo puedo hacer eso.
The Burningfire
23

Por favor, intente el siguiente programa. Es posible que esté esperando esta salida.

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

Guarde este programa en un archivo javascript, por ejemplo, square.js.

Luego ejecute el programa desde el símbolo del sistema con el comando node square.js

Lo que hace es, simplemente sobrescribir el archivo existente con un nuevo conjunto de datos, cada vez que ejecuta el comando.

Feliz codificación.

Jacob Nelson
fuente
11

debe leer el archivo cada vez que desee agregar una nueva propiedad al json y luego agregar las nuevas propiedades

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
fuente
1
gracias por la respuesta, probé su funcionamiento, pero cómo verificar si existe un archivo antiguo y luego ejecutar el código readfile, de lo contrario, ejecutar writeFile directamente para crear un archivo nuevo. archivo antiguo todo el día cuando se ejecuta este código
Isoftmaster
10

El ejemplo anterior también es correcto, pero proporciono un ejemplo 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");
});
Pankaj Chauhan
fuente
8

tratar

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

fuente
7

Para formatear jsonfile da la spacesopción que puede pasar como parámetro:

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

O utilice jsonfile.spaces = 4. Lea los detalles aquí .

No sugeriría escribir en el archivo cada vez en el bucle, en su lugar, construya el objeto JSON en el bucle y escriba en el archivo fuera del bucle.

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

Para aproximación sincrónica

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