情報アイランド

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

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

関連

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

-Node.js