Node.JSを使用して、JSONファイルを(サーバー)メモリに読み込むにはどうすればよいですか?


618

バックグラウンド

Node.jsでいくつかの実験を行っており、JSONオブジェクトをテキストファイルまたは.jsファイル(どちらが良いですか?)からメモリに読み込んで、コードからそのオブジェクトにすばやくアクセスできるようにしたいと考えています。モンゴやアルフレッドなどが世の中にあることに気づきましたが、それは今必要なものではありません。

質問

JavaScript / Nodeを使用して、JSONオブジェクトをテキストファイルまたはjsファイルからサーバーメモリに読み込むにはどうすればよいですか?


1
サーバーのメモリを何と呼びますか?nodejsスクリプトは、機能させる限り機能しますが、nodejsスクリプトを永続化しない限り、データをどこかに保存する必要があります。
mpm

回答:


1205

同期:

var fs = require('fs');
var obj = JSON.parse(fs.readFileSync('file', 'utf8'));

非同期:

var fs = require('fs');
var obj;
fs.readFile('file', 'utf8', function (err, data) {
  if (err) throw err;
  obj = JSON.parse(data);
});

15
JSON.parseは同期的で、v8から直接だと思います。つまり、非同期の方法でも、大きなJSONファイルには注意する必要があります。ノードを拘束するためです。
Sean_A91 2015

25
完全を期すために。それらはjsonfileと呼ばれるnpmが存在します。
ステファン

5
この単純なものを見つけるのがとても難しかったとは思えません。私がグーグルから得たすべての答えは、HTTPRequestを実行するか、JQueryを使用するか、ブラウザで実行すること
でした

6
2つのポイント:(1)同期の答えはである必要がありますlet imported = require("file.json")。(2)このコードを使用して70mb JSONファイルをオブジェクトとしてメモリにロードしたため、JSON.parseは非同期である必要があります。この方法ではミリ秒かかりますが、私が使用する場合require()、それはチャグします
カイルベイカー

8
2019年以降にこの回答を見つけた人々のために、Node.jsはからまでの多くのバージョンに対してネイティブのjsonサポートを提供してきましrequireた。jsonファイルをロードしたいだけの場合、この回答は適用されなくなりました。使用let data = require('./yourjsonfile.json')してすぐに使用できます(requireのパフォーマンスがコードに影響を与える場合は、「。jsonファイルをロードしたい」という問題をはるかに超える問題があることに注意してください)
Mike 'Pomax' Kamermans

392

これを行うために私が見つけた最も簡単な方法はrequire、JSONファイルへのパスを使用することです。

たとえば、次のJSONファイルがあるとします。

test.json

{
  "firstName": "Joe",
  "lastName": "Smith"
}

次に、これを使用してnode.jsアプリケーションにこれを簡単にロードできます。 require

var config = require('./test.json');
console.log(config.firstName + ' ' + config.lastName);

35
ちょうど知っているので、私が正しく覚えていれば、requirein nodeは同期的に実行されます。ここ
prasanthv 2014年

@Ramそれは私のために働くあなたの場所はtest.json彼の例とは異なるかもしれません。私が使用していますnode 5.0
guleria 2015年

18
そのような方法の別の問題/利点は、キャッシュされたインスタンスを明確に削除しない限り、必要なデータがキャッシュされるという事実です
magicode118

13
「require」は、アプリケーションの寿命全体を通じて使用しているモジュールまたは構成ファイルをロードするために使用することを意図しています。これを使用してファイルをロードするのは適切ではないようです。
Yaki Klein 2016年

2
これは潜在的にセキュリティの脅威だと思います。ロードしているjsonファイルにJSコードが含まれている場合、requireそのコードを実行しますか?もしそうなら、あなたは本当にあなたのjsonファイルがどこから来ているのかを制御する必要があります、そうでなければ攻撃者はあなたのマシンで悪意のあるコードを実行する可能性があります。
sokkyoku

57

非同期は理由があります! @mihaiで石を投げる

それ以外の場合、非同期バージョンで使用したコードは次のとおりです。

// Declare variables
var fs = require('fs'),
    obj

// Read the file and send to the callback
fs.readFile('path/to/file', handleFile)

// Write the callback function
function handleFile(err, data) {
    if (err) throw err
    obj = JSON.parse(data)
    // You can now play with your datas
}

9
同意:)、非同期も追加
mihai 2012

1
素晴らしい:-)インラインコールバックは好きではありませんが、コールバックの悪夢につながる可能性があるため、避けたいと思います。
Florian Margaine

9
同期して欲しいのでなければ、理由があります。
Matt Stephens、2016年

40

少なくともノードv8.9.1では、次のことができます

var json_data = require('/path/to/local/file.json');

JSONオブジェクトのすべての要素にアクセスします。


5
このアプローチは、ファイルを1回だけロードします。file.json(プログラムを再起動せずに)後で新しいrequire を変更する場合、データは最初のロードからのものになります。これを
裏付ける

あなたの答えはひどく不完全です。それによって得られるのはオブジェクトであり、tostring()を実装する必要さえありません。
デビッドA.グレイ

3
@ DavidA.Gray問題は、文字列としてではなく、オブジェクトとしてオブジェクトにアクセスできることを望んでいます。シングルトンの問題からの側は、Lukasがこの答えは問題ないと述べた。
mikemaccana

2
requireを使用すると、ファイル内の任意のコードも実行されます。この方法は安全ではないので、お勧めしません。
spoulson

16

Node 8では、組み込みを使用して、次のutil.promisify()ように非同期でファイルを読み取ることができます。

const {promisify} = require('util')
const fs = require('fs')
const readFileAsync = promisify(fs.readFile)

readFileAsync(`${__dirname}/my.json`, {encoding: 'utf8'})
  .then(contents => {
    const obj = JSON.parse(contents)
    console.log(obj)
  })
  .catch(error => {
    throw error
  })

3
.readFileはすでに非同期です。同期バージョンを探している場合、その名前は.readFileSyncです。
Aternus

promiseを使用したい場合はfs/promises、ノード10以降にも存在します。注:APIは実験的です:nodejs.org/api/fs.html#fs_fs_promises_api
aboutaaron

@Aternus .readFile非同期ですが、非同期ではありませんasync。つまり、関数はasyncキーワードで定義されておらず、Promiseも返さないため、実行できませんawait fs.readFile('whatever.json');
Kip

@Kip CodeSandBoxはどうですか?
Aternus

7

使用ノード-FS-余分な (非同期のawait)

const readJsonFile = async () => {
  try {
    const myJsonObject = await fs.readJson('./my_json_file.json');
    console.log(myJsonObject);
  } catch (err) {
    console.error(err)
  }
}

readJsonFile() // prints your json object

6

fs-extraパッケージの使用は非常に簡単です:

同期:

const fs = require('fs-extra')

const packageObj = fs.readJsonSync('./package.json')
console.log(packageObj.version) 

非同期:

const fs = require('fs-extra')

const packageObj = await fs.readJson('./package.json')
console.log(packageObj.version) 

3
function parseIt(){
    return new Promise(function(res){
        try{
            var fs = require('fs');
            const dirPath = 'K:\\merge-xml-junit\\xml-results\\master.json';
            fs.readFile(dirPath,'utf8',function(err,data){
                if(err) throw err;
                res(data);
        })}
        catch(err){
            res(err);
        }
    });
}

async function test(){
    jsonData = await parseIt();
    var parsedJSON = JSON.parse(jsonData);
    var testSuite = parsedJSON['testsuites']['testsuite'];
    console.log(testSuite);
}

test();

2

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfile_file_options_callback

var fs = require('fs');  

fs.readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
});  

// options
fs.readFile('/etc/passwd', 'utf8', callback);

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfilesync_file_options

Node.jsのすべての使用方法については、ファイルシステムのドキュメントをご覧ください。
これがあなたのために役立つことを願っています!


0

非常に多くの答えがあり、同期と非同期と必要とを比較するためのベンチマークを誰も作成していません。require、readFileSync、readFileを使用してメモリでjsonを読み取るユースケースの違いをここで説明しまし


-1

エラー処理をAsync使用しRelative PathてJSONファイルをロードするための完全なソリューションを探している場合

  // Global variables
  // Request path module for relative path
    const path = require('path')
  // Request File System Module
   var fs = require('fs');


// GET request for the /list_user page.
router.get('/listUsers', function (req, res) {
   console.log("Got a GET request for list of users");

     // Create a relative path URL
    let reqPath = path.join(__dirname, '../mock/users.json');

    //Read JSON from relative path of this file
    fs.readFile(reqPath , 'utf8', function (err, data) {
        //Handle Error
       if(!err) {
         //Handle Success
          console.log("Success"+data);
         // Parse Data to JSON OR
          var jsonObj = JSON.parse(data)
         //Send back as Response
          res.end( data );
        }else {
           //Handle Error
           res.end("Error: "+err )
        }
   });
})

ディレクトリ構造:

ここに画像の説明を入力してください

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