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"}
関連
