zapis/dodawanie danych w pliku JSON za pomocą węzła.js

Próbuję zapisać plik JSON używając węzła z danych pętli eg

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

Wyjście w pętli.json jest

id :1 square : 1

Ale chcę plik wyjściowy taki jak ten (poniżej), a także jeśli uruchomię ten kod ponownie powinien dodać to nowe wyjście 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 po raz pierwszy, ale za każdym razem, gdy uruchamiam ten kod, nowe elementy powinny być dodawane do tego samego pliku

var fs = require('fs');

var 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});
        }
        var 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});
        }
        var json = JSON.stringify(obj);
        fs.writeFile('myjsonfile.json', json);
        }
    });
Author: Philip Kirkbride, 2016-04-26

5 answers

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

  1. Tworzenie obiektu javascript z tablicą w nim

    var obj = {
       table: []
    };
    
  2. Dodaj do niego jakieś dane jak

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

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

    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 do obiektu

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

To będzie działać dla danych dużych jak 100 MB max skutecznie. 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 łańcuch znaków. Utwórz plik o nazwie ten ciąg znaków + .json. moduł fs posiada funkcję, która może sprawdzić istnienie pliku o nazwie fs.stat (path, callback). Dzięki temu możesz sprawdzić, czy plik istnieje. Jeśli istnieje, użyj funkcji read jeśli nie jest, Użyj funkcji create. Użyj ciągu daty jako ścieżka ponieważ plik zostanie nazwany jako dzisiejsza data + .json. wywołanie zwrotne będzie zawierać obiekt stats, który będzie null, Jeśli plik nie istnieje.

 198
Author: kailniris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-31 16:08:53

Proszę wypróbować następujący program. Możesz się tego spodziewać.

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 kwadrat.js.

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

To, co robi, to po prostu nadpisanie istniejącego pliku nowym zestawem danych, za każdym razem, gdy wykonujesz polecenie.

Szczęśliwego Kodowania.
 8
Author: Jacob Nelson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 06:15:39

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;
  })
})
 5
Author: Zamboney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 06:13:11

Do formatowania jsonfile daje opcję spaces którą można przekazać jako parametr:

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

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

Nie sugerowałbym zapisywania 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);
});
 3
Author: avck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 06:45:48

Powyższy przykład jest również poprawny, ale podaję 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");
});
 0
Author: Pankaj Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-13 11:31:21