Escreva / adicione dados no arquivo JSON usando o Node.js

196

Estou tentando escrever o arquivo JSON usando o nó dos dados do loop, por exemplo:

let jsonFile = require('jsonfile');

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

outPut em loop.json é:

id :1 square : 1

mas eu quero um arquivo de saída como este (abaixo) e também se eu executar esse código novamente, ele deverá adicionar essa nova saída como elementos no mesmo arquivo 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
      }
   ]
}

Quero usar o mesmo arquivo que criei pela primeira vez, mas sempre que executo esse código, novos elementos devem ser adicionados ao mesmo arquivo

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
fonte

Respostas:

386

Se esse arquivo json não se tornar muito grande ao longo do tempo, tente:

  1. Crie um objeto javascript com a matriz da tabela

    var obj = {
       table: []
    };
  2. Adicione alguns dados a ele como

    obj.table.push({id: 1, square:2});
  3. Converta-o de um objeto para string com stringify

    var json = JSON.stringify(obj);
  4. use fs para gravar o arquivo no disco

    var fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', callback);
  5. se você quiser anexá-lo, leia o arquivo json e converta-o novamente em um 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 
    }});

Isso funcionará para dados de até 100 MB no máximo. Acima desse limite, você deve usar um mecanismo de banco de dados.

ATUALIZAR:

Crie uma função que retorne a data atual (ano + mês + dia) como uma sequência. Crie o arquivo chamado esta sequência + .json. o módulo fs possui uma função que pode verificar a existência do arquivo chamado fs.stat (caminho, retorno de chamada). Com isso, você pode verificar se o arquivo existe. Se existir, use a função de leitura, se não estiver, use a função de criação. Use a string de data como o caminho, pois o arquivo será nomeado como a data de hoje + .json. o retorno de chamada conterá um objeto de estatísticas que será nulo se o arquivo não existir.

kailniris
fonte
1
obrigado pela resposta eu tentei o seu trabalho, mas como verificar se existe um arquivo antigo, execute o código readlfile ou execute writeFile direto Estou criando um novo arquivo diário com a data atual no nome do arquivo e quero que novos dados sejam adicionados nesse arquivo antigo o dia inteiro quando este código run
Isoftmaster
1
obrigado mais uma vez eu fiz o meu código de trabalho: D com todo o seu apoio, mas eu usei fs.exists funcionar minha pergunta atualizado com resposta
Isoftmaster
Ou você também pode usar o pacote jsonfile Node, que envolve todas as complexidades não mostradas no código acima.
Jeach 24/01/19
e se a "tabela" ou as propriedades do objeto JSON não forem conhecidas antecipadamente ???
oldboy 3/01
@kailniris senhor como posso atualizar um nó específico no meu arquivo json local em js.ie angular eu tenho um arquivo config.json eu queria atualizar um nó específico dele, então como posso fazer isso.
theburningfire
23

Por favor, tente o seguinte programa. Você pode estar esperando esta saída.

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

Salve este programa em um arquivo javascript, por exemplo, square.js.

Em seguida, execute o programa no prompt de comando usando o comando node square.js

O que ele faz é simplesmente substituir o arquivo existente por um novo conjunto de dados, toda vez que você executar o comando.

Feliz codificação.

Jacob Nelson
fonte
11

você deve ler o arquivo sempre que desejar adicionar uma nova propriedade ao json e, em seguida, adicionar as novas propriedades

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
fonte
1
obrigado pela resposta eu tentei o seu trabalho, mas como verificar se existe um arquivo antigo, execute o código readlfile ou execute writeFile direto para criar um novo arquivo, eu estou criando diariamente um novo arquivo com a data atual no nome do arquivo e quero que novos dados sejam adicionados nesse dia inteiro arquivo de idade, quando este código run
Isoftmaster
10

O exemplo acima também está correto, mas eu forneço um exemplo simples:

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

experimentar

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

fonte
7

Para formatar, o jsonfile dá a spacesopção que você pode passar como parâmetro:

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

Ou use jsonfile.spaces = 4. Leia os detalhes aqui .

Eu não sugeriria escrever um arquivo toda vez no loop, em vez disso, construir o objeto JSON no loop e gravar no arquivo fora do loop.

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

Para abordagem síncrona

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