web-dev-qa-db-ja.com

node.jsを使用してJSONファイルにデータを書き込み/追加する

私はループデータからノードを使用してJSONファイルを書き込もうとしています。

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

loop.jsonのoutPutは

id :1 square : 1

しかし、私は(下記の)このような出力ファイルが欲しいです、そしてまた私がそのコードを実行するならば、それは同じ既存の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
    }
  ]
}

最初に作成したものと同じファイルを使用したいのですが、そのコードを実行するたびに新しい要素が同じファイルに追加されます。

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

このjsonファイルが時間の経過とともに大きくなりすぎない場合は、試してみる必要があります。

  1. テーブル配列を含むJavaScriptオブジェクトを作成します。

    var obj = {
       table: []
    };
    
  2. 好きなようにデータを追加してください

    obj.table.Push({id: 1, square:2});
    
  3. Stringifyを使ってオブジェクトから文字列に変換する

    var json = JSON.stringify(obj);
    
  4. fsを使ってファイルをディスクに書き込む

    var fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', callback);
    
  5. 追加したい場合は、jsonファイルを読み込んでオブジェクトに変換し直します。

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

これは最大100 MBのデータに対して効果的に機能します。この制限を超えると、データベースエンジンを使用する必要があります。

更新:

現在の日付(年+月+日)を文字列として返す関数を作成します。この文字列+ .jsonという名前のファイルを作成します。 fsモジュールには、fs.stat(path、callback)というファイルの存在を確認できる機能があります。これにより、ファイルが存在するかどうかを確認できます。存在する場合はread関数を使用し、存在しない場合はcreate関数を使用します。ファイルに今日の日付+ .jsonという名前が付けられるパスcuzとして日付文字列を使用します。コールバックにはstatsオブジェクトが含まれ、ファイルが存在しない場合はnullになります。

284
kailniris

次のプログラムを試してください。あなたはこの出力を期待しているかもしれません。

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

このプログラムをjavascriptファイル、たとえばsquare.jsに保存します。

次に、コマンドnode square.jsを使用してコマンドプロンプトからプログラムを実行します。

つまり、コマンドを実行するたびに、既存のファイルを新しいデータセットで上書きするだけです。

ハッピーコーディング.

11
Jacob Nelson

上記の例も正しいですが、私は簡単な例を提供します:

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

jsonに新しいプロパティを追加するたびに、ファイルを読んでから、新しいプロパティを追加してください。

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

フォーマットするためにjsonfileはあなたがパラメータとして渡すことができるspacesオプションを与えます:

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

またはjsonfile.spaces = 4を使用してください。詳細を読む ここ

ループ内で毎回ファイルに書き込むことはお勧めしません。代わりにループ内でJSONオブジェクトを作成し、ループ外でファイルに書き込みます。

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

同期アプローチの場合

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

やってみる

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