Node.jsでJSONファイルのデータを読み込む
JSONファイルのデータを読み込むには非同期的に読み込む方法と同期的に読み込む方法の2つがあります。
非同期的な読み込み
JSONファイルのデータを非同期的に読み込むにはjsonfile
モジュールのjsonfile.readFile
関数やfs-extra
モジュールのfsExtra.readJson
関数を使用します。
var jsonfile = require('jsonfile');
jsonfile.readFile('xxx', {
encoding: 'utf-8',
reviver: null,
throws: true
}, function (err, data) {
});
var fsExtra = require('fs-extra');
fsExtra.readJson('xxx', {
encoding: 'utf-8',
reviver: null,
throws: true
}, function (err, data) {
});
第1引数にファイルのパスを指定します。
第2引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。
オプションには下のようなものがあります。
encoding
・・・JSONファイルの文字コードを指定します。reviver
・・・JSON.parse
関数の第2引数として使用する値を指定します。throws
・・・JSON.parse
関数の呼び出しにおいて例外が発生した場合に第3引数のコールバック関数の第1引数のエラーオブジェクトにこの例外のエラーオブジェクトを設定するかを真偽値として指定します。デフォルトはtrue
です。
第3引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトであり、第2引数はJSONファイルのデータです。
このデータはオブジェクトとなります。
なお、ファイルが存在しない場合にはエラーが発生します。
同期的な読み込み
JSONファイルのデータを同期的に読み込むにはjsonfile
モジュールのjsonfile.readFileSync
関数やfs-extra
モジュールのfsExtra.readJsonSync
関数を使用します。
var data = jsonfile.readFileSync('xxx', {
encoding: 'utf-8',
reviver: null,
throws: true
});
var data = fsExtra.readJsonSync('xxx', {
encoding: 'utf-8',
reviver: null,
throws: true
});
第1引数にファイルのパスを指定します。
第2引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。このオプションはjsonfile.readFile
関数の第2引数のオプションと同じです。
返り値としてJSONファイルのデータが得られます。
このデータはオブジェクトとなります。
なお、ファイルが存在しない場合にはエラーが発生します。
使い分け
原則的にはjsonfile.readFile
関数やfsExtra.readJson
関数を使用するべきであり、特に理由がないならjsonfile.readFileSync
関数やfsExtra.readJsonSync
関数は使用するべきではありません。
これは、ファイルへのアクセスは非常に時間の掛かる処理であるためです。ファイルへのアクセスを同期的に行うとアクセスが完了するまでプログラムは待機状態となり、他の処理を行うことができません。長い時間プログラムが待機状態になると様々な問題を引き起こす可能性があります(このような現象をスターベーションと言います)。
スターベーションとは?
サンプルコード1
jsonfile.readFile
関数の使用例です。
3つ目のコマンドライン引数として与えられたJSONファイルのデータを非同期的に読み込み、標準出力に出力します。
jsonfile-readfile.js
var jsonfile = require('jsonfile');
if (process.argv.length < 3) {
console.error('lack argument.');
process.exit(1);
}
jsonfile.readFile(process.argv[2], {
encoding: 'utf-8'
}, function (err, data) {
if (err) {
console.error(err);
process.exit(1);
}
else {
console.log(data);
}
});
使用パッケージ
- jsonfile
npm install jsonfile
でインストールします。
実行結果
現在のフォルダにはpizyumi.json
という名称のJSONファイルが存在しています(文字コードはUTF-8
です)。
C:\work\node>type pizyumi.json
{
"name": "pizyumi",
"age": 26,
"address": "fukui"
}
このJSONファイルを3つ目のコマンドライン引数に指定してコードを実行すると正しく内容が出力されます。
C:\work\node>node jsonfile-readfile.js pizyumi.json
{ name: 'pizyumi', age: 26, address: 'fukui' }
存在しないJSONファイルやフォルダを指定した場合にはエラーが発生します。
C:\work\node>node jsonfile-readfile.js pizyumi2.json
{ Error: ENOENT: no such file or directory, open 'C:\work\node\pizyumi2.json'
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\work\\node\\pizyumi2.json' }
C:\work\node>node jsonfile-readfile.js C:\work\node
{ Error: EISDIR: illegal operation on a directory, read errno: -4068, code: 'EISDIR', syscall: 'read' }
関連
