Zapisz / dodaj dane w pliku JSON przy użyciu Node.js

198

Próbuję zapisać plik JSON przy użyciu węzła z danych pętli, np .:

let jsonFile = require('jsonfile');

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

outPut w loop.json to:

id :1 square : 1

ale chcę plik wyjściowy taki jak poniżej (a także), jeśli ponownie uruchomię ten kod, powinien dodać ten nowy wynik jako elementy w tym samym istniejącym pliku JSON:

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

Chcę użyć tego samego pliku, który utworzyłem za pierwszym razem, ale za każdym razem, gdy uruchamiam ten kod, nowe elementy powinny być dodawane w tym samym pliku

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
źródło

Odpowiedzi:

387

Jeśli ten plik json z czasem nie stanie się zbyt duży, powinieneś spróbować:

  1. Utwórz obiekt javascript z tablicą tabel

    var obj = {
       table: []
    };
  2. Dodaj trochę danych, takich jak

    obj.table.push({id: 1, square:2});
  3. Konwertuj go z obiektu na ciąg za pomocą stringify

    var json = JSON.stringify(obj);
  4. użyj fs, aby zapisać plik na dysku

    var fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', callback);
  5. jeśli chcesz go dołączyć, przeczytaj plik json i przekonwertuj go z powrotem na obiekt

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

Działa to skutecznie dla danych o wielkości do 100 MB. Powyżej tego limitu należy użyć silnika bazy danych.

AKTUALIZACJA:

Utwórz funkcję, która zwraca bieżącą datę (rok + miesiąc + dzień) jako ciąg. Utwórz plik o nazwie ten ciąg + .json. moduł fs ma funkcję sprawdzania istnienia pliku o nazwie fs.stat (ścieżka, wywołanie zwrotne). Dzięki temu możesz sprawdzić, czy plik istnieje. Jeśli istnieje, użyj funkcji odczytu, jeśli nie, użyj funkcji tworzenia. Użyj ciągu daty jako ścieżki, ponieważ plik zostanie nazwany jako data dzisiejsza + .json. wywołanie zwrotne będzie zawierać obiekt statystyki, który będzie miał wartość NULL, jeśli plik nie istnieje.

kailniris
źródło
1
dzięki za odpowiedź Próbowałem działać, ale jak sprawdzić, czy stary plik istnieje, uruchom kod readlfile, inaczej uruchom writeFile direct Tworzę codziennie nowy plik z bieżącą datą w nazwie pliku i chcę, aby nowe dane były dodawane do tego starego pliku przez cały dzień po uruchomieniu tego kodu
Isoftmaster
1
jeszcze raz dziękuję, sprawiłem, że mój kod działał: D z całym waszym wsparciem, ale użyłem funkcji fs.exists moje pytanie zaktualizowane o odpowiedź
Isoftmaster
Możesz też użyć pakietu węzła jsonfile , który otacza wszystkie złożoności nie pokazane w powyższym kodzie.
Jeach
co jeśli „tabela” lub właściwości obiektu JSON nie są wcześniej znane?
oldboy
@ kailniris sir, jak mogę zaktualizować konkretny węzeł w moim lokalnym pliku json w Angular Js.ie Mam plik config.json Chciałem zaktualizować konkretny węzeł, jak to zrobić.
theburningfire
23

Wypróbuj następujący program. Być może spodziewasz się tego wyniku.

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

Zapisz ten program w pliku javascript, powiedzmy, square.js.

Następnie uruchom program z wiersza polecenia, używając polecenia node square.js

Po prostu zastępuje istniejący plik nowym zestawem danych za każdym razem, gdy wykonuje się polecenie.

Happy Coding.

Jacob Nelson
źródło
12

powinieneś przeczytać plik za każdym razem, gdy chcesz dodać nową właściwość do json, a następnie dodać nowe właściwości

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
źródło
1
dzięki za odpowiedź, próbowałem działać, ale jak sprawdzić, czy stary plik istnieje, uruchom kod readlfile, w przeciwnym razie uruchom writeFile bezpośrednio, aby utworzyć nowy plik. Tworzę codziennie nowy plik z bieżącą datą w nazwie pliku i chcę dodać nowe dane w tym pliku stary plik cały dzień po uruchomieniu tego kodu
Isoftmaster
10

Powyższy przykład jest również poprawny, ale podam prosty przykład:

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
źródło
8

próbować

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

źródło
7

Do formatowania plik json daje spacesopcję, którą możesz przekazać jako parametr:

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

Lub użyj jsonfile.spaces = 4. Przeczytaj szczegóły tutaj .

Nie sugerowałbym pisania do pliku za każdym razem w pętli, zamiast tego konstruuj obiekt JSON w pętli i zapisuj do pliku poza pętlą.

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
źródło
7

Dla podejścia synchronicznego

const fs = require('fs')
fs.writeFileSync('file.json', JSON.stringify(jsonVariable));
Nirojan Selvanathan
źródło