情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでJSONファイルにデータを書き込む

JSONファイルにデータを書き込むには非同期的に書き込む方法と同期的に書き込む方法の2つがあります。

非同期的な書き込み

JSONファイルにデータを非同期的に書き込むにはjsonfileモジュールのjsonfile.writeFile関数やfs-extraモジュールのfsExtra.writeJson関数を使用します。

var jsonfile = require('jsonfile');

jsonfile.writeFile('xxx', { foo: 'aaa', bar: 'bbb' }, {
    encoding: 'utf-8', 
    replacer: null, 
    spaces: null
}, function (err) {
});
var fsExtra = require('fs-extra');

fsExtra.writeJson('xxx', { foo: 'aaa', bar: 'bbb' }, {
    encoding: 'utf-8', 
    replacer: null, 
    spaces: null
}, function (err) {
});

第1引数にファイルのパスを指定します。

第2引数にJSONファイルに書き込むデータを指定します。オブジェクトを指定します。

第3引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。

オプションには下のようなものがあります。

  • encoding・・・JSONファイルの文字コードを指定します。
  • replacer・・・JSON.stringify関数の第2引数として使用する値を指定します。
  • spaces・・・JSON.stringify関数の第3引数として使用する値(インデントの長さ又はインデントに使用する文字)を指定します。

第4引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトです。

なお、ファイルが既に存在する場合には上書きされます。

同期的な書き込み

JSONファイルにデータを同期的に書き込むにはjsonfileモジュールのjsonfile.writeFileSync関数やfs-extraモジュールのfsExtra.writeJsonSync関数を使用します。

var data = jsonfile.writeFileSync('xxx', { foo: 'aaa', bar: 'bbb' }, {
    encoding: 'utf-8', 
    replacer: null, 
    spaces: null
});
var data = fsExtra.writeJsonSync('xxx', { foo: 'aaa, bar: 'bbb' }, {
    encoding: 'utf-8', 
    replacer: null, 
    spaces: null
});

第1引数にファイルのパスを指定します。

第2引数にJSONファイルに書き込むデータを指定します。オブジェクトを指定します。

第3引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。このオプションはjsonfile.writeFile関数の第3引数のオプションと同じです。

なお、ファイルが既に存在する場合には上書きされます。

注意事項

jsonfile.writeFile関数やfsExtra.writeJson関数やjsonfile.writeFileSync関数やfsExtra.writeJsonSync関数は存在しないフォルダのファイルにデータを書き込むことはできません(存在しないフォルダを自動的に作成することはできません)。

存在しないフォルダのJSONファイルにデータを書き込むには下のような関数を使用します

  • fs-extraモジュールのfsExtra.outputJson関数・・・この関数の引数はjsonfile.writeFile関数と同じです。
  • fs-extraモジュールのfsExtra.outputJsonSync関数・・・この関数の引数はjsonfile.writeFileSync関数と同じです。

使い分け

原則的にはjsonfile.writeFile関数やfsExtra.writeJson関数やfsExtra.outputJson関数を使用するべきであり、特に理由がないならjsonfile.writeFileSync関数やfsExtra.writeJsonSync関数やfsExtra.outputJsonSync関数は使用するべきではありません。

これは、ファイルへのアクセスは非常に時間の掛かる処理であるためです。ファイルへのアクセスを同期的に行うとアクセスが完了するまでプログラムは待機状態となり、他の処理を行うことができません。長い時間プログラムが待機状態になると様々な問題を引き起こす可能性があります(このような現象をスターベーションと言います)。

サンプルコード1

jsonfile.writeFile関数の使用例です。

3つ目のコマンドライン引数として与えられたファイルにJSONデータを非同期的に書き込みます。

jsonfile-writeFile.js

var jsonfile = require('jsonfile');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

jsonfile.writeFile(process.argv[2], {
    name: 'pizyumi', 
    age: 26, 
    address: 'fukui'
}, {
    encoding: 'utf-8'
}, function (err) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log('finished!!');
    }
});

使用パッケージ

  • jsonfile
    npm install jsonfileでインストールします。

実行結果

pizyumi.jsonを3つ目のコマンドライン引数に指定してコードを実行すると正しくファイルにJSONデータが書き込まれます。

C:\work\node>node jsonfile-writeFile.js pizyumi.json
finished!!

C:\work\node>type pizyumi.json
{"name":"pizyumi","age":26,"address":"fukui"}

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js