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


196

ループデータのノードを使用してJSONファイルを書き込もうとしています。例:

let 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
      }
   ]
}

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

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

回答:


386

この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という名前が付けられます。コールバックには、ファイルが存在しない場合はnullになるstatsオブジェクトが含まれます。


1
返信ありがとうございます、動作しましたが、古いファイルが存在するかどうかを確認する方法、次にreadlfileコードを実行するか、writeFile directを実行します。ファイル名に現在の日付を使用して毎日新しいファイルを作成し、新しいデータをその古いファイルに終日追加しますこのコードの実行時
Isoftmaster

1
すべてのご支援とDが、私はfs.existsは私の質問には答えを更新機能を使用:私は働いて自分のコードを作っもう一度ありがとう
Isoftmaster

または、上記のコードに示されていないすべての複雑さをラップするjsonfile Nodeパッケージを使用することもできます。
Jeach

JSONオブジェクトの「テーブル」またはプロパティが事前にわからない場合はどうなりますか?
オールドボーイ

@kailniris sirローカルjsonファイル内の特定のノードを角度jsで更新するにはどうすればよいですか。
theburningfire

23

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

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

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

1
返信ありがとうございます、動作しましたが、古いファイルが存在するかどうかを確認する方法、次にreadlfileコードを実行するか、writeFile directを実行して新しいファイルを作成し、ファイル名に現在の日付で毎日新しいファイルを作成しています。このコードが実行される古いファイル(終日)
Isoftmaster

10

上記の例も正しいですが、簡単な例を示します:

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

8

試す

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

7

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.