web-dev-qa-db-ja.com

Node.jsを使用してJSONを解析する方法

Node.jsを使用してJSONを解析する方法JSONを安全に検証して解析するモジュールはありますか?

913
Tikhon Jelvis

単に JSON.parse を使うことができます。 

JSONオブジェクト の定義はECMAScript 5仕様 の一部です。 node.jsは、Google Chromeの V8 エンジン上に構築されており、これはECMA標準に準拠しています。したがって、node.jsにはグローバルオブジェクト JSONもあります。[docs] 。 

注 - JSON.parse は同期方式であるため、現在のスレッドを拘束できます。そのため、大きなJSONオブジェクトを解析する予定の場合は、ストリーミングJSONパーサーを使用してください。

1029
Felix Kling

require .jsonファイルを作成できます。

var parsedJSON = require('./file-name');

たとえば、ソースコードファイルと同じディレクトリにconfig.jsonファイルがある場合は、次のようにします。

var config = require('./config.json');

または(ファイル拡張子は省略可能)

var config = require('./config');

require 同期 であり、ファイルを読み取るのは once のみで、後続の呼び出しはキャッシュからの結果を返します

また、ファイル内の任意のコードを実行する可能性があるため、これは絶対制御下のローカルファイルに対してのみ使用してください。

637
eliocs

JSON.parse()を使うことができます。

あなたはどんな ECMAScript 5 と互換性のあるJavaScript実装でもJSONオブジェクトを使うことができるはずです。そして、Node.jsが構築されている V8 )もそれらのうちの一つです。

注:機密情報(パスワードなど)の保存にJSONファイルを使用している場合、それは間違った方法です。 Herokuがどのように機能しているかを確認してください: https://devcenter.heroku.com/articles/config-vars#setting-up-config-vars-for-a-deployed-application 。プラットフォームがどのように機能しているかを調べてください。コード内から設定変数を取得するにはprocess.envを使用します。


JSONデータを含む文字列を解析する

var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);

JSONデータを含むファイルの解析

fsモジュールでファイル操作をする必要があります。

非同期バージョン

var fs = require('fs');

fs.readFile('/path/to/file.json', 'utf8', function (err, data) {
    if (err) throw err; // we'll not consider error handling for now
    var obj = JSON.parse(data);
});

同期バージョン

var fs = require('fs');
var json = JSON.parse(fs.readFileSync('/path/to/file.json', 'utf8'));

あなたはrequireを使いたいですか?もう一度考えてみて!

require を使うこともできます。

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

しかし、私はいくつかの理由でこれをお勧めしません。

  1. requireは同期です。非常に大きなJSONファイルがあると、それがイベントループを妨げます。あなたは本当にJSON.parsefs.readFileと一緒に使う必要があります。
  2. requireはファイル一度だけを読み込みます。同じファイルに対してrequireを続けて呼び出すと、キャッシュコピーが返されます。継続的に更新される.jsonファイルを読みたいのであればお勧めできません。あなたは a hack を使うことができます。しかしこの時点では、単にfsを使うほうが簡単です。
  3. ファイルに.json拡張子が付いていない場合、requireはファイルの内容をJSONとして扱いません。

真剣に! JSON.parseを使用してください。


load-json-fileモジュール

もしあなたがたくさんの.jsonファイルを読んでいるのであれば(そしてあなたが極端に怠惰であれば)、毎回定型コードを書くのは面倒です。 load-json-file モジュールを使用していくつかの文字を保存することができます。

const loadJsonFile = require('load-json-file');

非同期バージョン

loadJsonFile('/path/to/file.json').then(json => {
    // `json` contains the parsed object
});

同期バージョン

let obj = loadJsonFile.sync('/path/to/file.json');

ストリームからのJSONの解析

JSONコンテンツがネットワーク経由でストリーミングされている場合は、ストリーミングJSONパーサーを使用する必要があります。そうでなければ、JSONコンテンツが完全にストリーミングされるまで、それはあなたのプロセッサを拘束し、あなたのイベントループを詰まらせるでしょう。

たくさんのNPM で利用可能なパッケージがあります。あなたに最適なものを選んでください。


エラー処理/セキュリティ

JSON.parse()に渡されるものが 有効なJSON であるかどうかわからない場合は、JSON.parse()への呼び出しをtry/catchブロックで囲むようにしてください。ユーザー提供のJSON文字列はアプリケーションをクラッシュさせ、セキュリティホールにつながる可能性もあります)。外部提供のJSONを解析する場合は、エラー処理が確実に行われるようにしてください。

299
sampathsris
79
Mark Kahn

JSON.parseの別の例:

var fs = require('fs');
var file = __dirname + '/config.json';

fs.readFile(file, 'utf8', function (err, data) {
  if (err) {
    console.log('Error: ' + err);
    return;
  }

  data = JSON.parse(data);

  console.dir(data);
});
33
pyprism

グローバルなJSONオブジェクトに代わるものがあることを述べたいのですが。 JSON.parseJSON.stringifyはどちらも同期なので、大きなオブジェクトを扱うのであれば、非同期のJSONモジュールのいくつかを調べたいと思うかもしれません。

見てください: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json

32
Haider

node-fsライブラリをインクルードしてください。

var fs = require("fs");
var file = JSON.parse(fs.readFileSync("./PATH/data.json", "utf8"));

'fs'ライブラリの詳細については、 http://nodejs.org/api/fs.html のドキュメントを参照してください。

28
Abhishek Verma

あなたはあなたの文字列が実際に有効であることを知らないので、私は最初にtry catchにそれを入れるでしょう。 try catchブロックはノードごとに最適化されていないので、全体を別の関数に入れます。

function tryParseJson(str) {
    try {
        return JSON.parse(str);
    } catch (ex) {
        return null;
    }
}

または「非同期スタイル」の場合

function tryParseJson(str, callback) {
    process.nextTick(function () {
      try {
          callback(null, JSON.parse(str));
      } catch (ex) {
          callback(ex)
      }
    })
}
9
Vlad

JSONストリームを解析するJSONStreamを使用してください。

var request = require('request')
  , JSONStream = require('JSONStream')

request({url: 'http://isaacs.couchone.com/registry/_all_docs'})
    .pipe(JSONStream.parse('rows.*'))
    .pipe(es.mapSync(function (data) {
      return data
    }))

https://github.com/dominictarr/JSONStream

8
Burcu Dogan
JSON.parse("your string");

それで全部です。

7
debianmaster

ここでの他の答えが述べているように、あなたはおそらくあなたが安全で存在していることが分かっているローカルのjsonファイルを必要としたいでしょう。

var objectFromRequire = require('path/to/my/config.json'); 

グローバルJSONオブジェクトを使用して文字列値をオブジェクトに解析するには、次のようにします。

var stringContainingJson = '\"json that is obtained from somewhere\"';
var objectFromParse = JSON.parse(stringContainingJson);

ファイルが必要なときはそのファイルの内容が評価されるため、jsonファイルではなくjsファイルである場合にはセキュリティ上のリスクがあります。

ここで、私はあなたが両方の方法を見て、それらをオンラインで遊ぶことができるデモを公開しました(解析例はapp.jsファイルにあります - それから実行ボタンをクリックしてターミナルで結果を見る) http://staging1.codefresh.io/labs/api/env/json-parse-example

あなたはコードを修正してその影響を見ることができます...

6
nathan g

ここのみんながJSON.parseについて言ったので、私は他の何かを言うことを考えました。 Connect アプリの開発をより簡単にそしてより良くするための多くのミドルウェアを備えた素晴らしいモジュールがあります。ミドルウェアの1つは bodyParser です。 JSON、html-formsなどを解析します。JSON解析専用の特定のミドルウェア noop もあります。 

上記のリンクを見てください、それはあなたにとって本当に役に立つかもしれません。 

5

私の解決策:

var fs = require('fs');
var file = __dirname + '/config.json';

fs.readFile(file, 'utf8', function (err, data) {
    if (err) {
        console.log('Error: ' + err);
        return;
    }

    data = JSON.parse(data);

    console.dir(data);
});
5
Ravindra Galav

Node.jsでの設定にJSONを使用していますか?これを読んで、9000を超える構成スキルを身につけてください...

注:data = require( './ data.json');と主張する人々はセキュリティリスクであり、熱心な熱意で人々の答えを下げます。あなたは正確かつ完全にwrongです。そのファイルに非JSONを配置してみてください... Nodeはエラーを表示します。exactlymuchで同じことをした場合のように=手動でファイルを読み取ってからJSON.parse()をコーディングするのが遅くて難しくなります。誤った情報の拡散を停止してください。あなたは助けではなく、世界を傷つけています。 Nodeは、これを許可するようにdesigned; これはセキュリティ上のリスクではありません!

適切なアプリケーションは、3 +layersの構成で提供されます。

  1. サーバー/コンテナの構成
  2. アプリケーション構成
  3. (オプション)テナント/コミュニティ/組織の構成
  4. ユーザー設定

ほとんどの開発者は、サーバーとアプリの構成を変更できるかのように扱います。できません。 レイヤーの変更上位のレイヤーを重ねることができますが、基本要件の変更です。いくつかのもの必要存在する!基本的にはソースコードと同じように、いくつかの設定が不変のように動作するようにします。

起動後にtry/catchブロックで設定の読み込みを散らかすなどのアンチパターンにつながり、なしで続行できるふりをした後、多くのものが変更されないことを確認しないと適切にセットアップされたアプリケーション。できません。可能であれば、サーバー/アプリ構成レイヤーではなく、コミュニティ/ユーザー構成レイヤーに属します。あなたはそれを間違っているだけです。アプリケーションがブートストラップを完了すると、オプションのものを上に重ねる必要があります。

頭を壁にぶつけないでください:設定はultra simpleでなければなりません。

シンプルなjson configファイルとシンプルなapp.jsファイルを使用して、プロトコルに依存しない、データソースに依存しないサービスフレームワークのような複雑なものをセットアップするのがどれほど簡単かを見てみましょう...

container-config.js ...

{
    "service": {
        "type"  : "http",
        "name"  : "login",
        "port"  : 8085
    },
    "data": {
        "type"  : "mysql",
        "Host"  : "localhost",
        "user"  : "notRoot",
        "pass"  : "oober1337",
        "name"  : "connect"
    }
}

index.js ...(すべてを動かすエンジン)

var config      = require('./container-config.json');       // Get our service configuration.
var data        = require(config.data.type);            // Load our data source plugin ('npm install mysql' for mysql).
var service     = require(config.service.type);         // Load our service plugin ('http' is built-in to node).
var processor   = require('./app.js');                  // Load our processor (the code you write).

var connection  = data.createConnection({ Host: config.data.Host, user: config.data.user, password: config.data.pass, database: config.data.name });
var server      = service.createServer(processor);
connection.connect();
server.listen(config.service.port, function() { console.log("%s service listening on port %s", config.service.type, config.service.port); });

app.js ...(プロトコルに依存しないサービスおよびデータソースに依存しないサービスを強化するコード)

module.exports = function(request, response){
    response.end('Responding to: ' + request.url);
}

このパターンを使用すると、起動したアプリの上にコミュニティとユーザー設定を読み込むことができます。devopsは、作業をコンテナーに押し込み、スケーリングする準備ができています。マルチテナント向けに読みました。ユーザーランドは隔離されています。使用しているサービスプロトコル、使用しているデータベースタイプの懸念を分離し、適切なコードの作成に集中することができます。

レイヤーを使用しているため、いつでもすべての単一の真実のソースに依存して(レイヤー化された構成オブジェクト)、すべてのステップでエラーチェックを回避できます。 this適切な設定なしで動作しますか?!?」。

5
Nick Steele

(私はしばらくの間それに苦労したように)ちょうど答えを完成させたい、json情報にアクセスする方法を示したい、この例はJson Arrayにアクセスすることを示します:

var request = require('request');
request('https://server/run?oper=get_groups_joined_by_user_id&user_id=5111298845048832', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var jsonArr = JSON.parse(body);
    console.log(jsonArr);
    console.log("group id:" + jsonArr[0].id);
  }
})

4
Eli

これをできるだけ複雑にして、できるだけ多くのパッケージを取り込むために...

const fs = require('fs');
const bluebird = require('bluebird');
const _ = require('lodash');
const readTextFile = _.partial(bluebird.promisify(fs.readFile), _, {encoding:'utf8',flag:'r'});
const readJsonFile = filename => readTextFile(filename).then(JSON.parse);

これにより、次のことが可能になります。

var dataPromise = readJsonFile("foo.json");
dataPromise.then(console.log);

あるいは、async/awaitを使っているのなら:

let data = await readJsonFile("foo.json");

readFileSyncを使用するだけの利点は、ファイルがディスクから読み取られている間、Nodeサーバが他の要求を処理できることです。

3
mpen

JSONに破損したデータがある場合は、必ず try catch blockでJSON.parseを必ず使用してください。ノードに予期しないエラーが発生するため、単純なJSON.Parseではなくこのコードを使用してください

try{
     JSON.parse(data)
}
catch(e){
   throw new Error("data is corrupted")
  }
2
Rahul Kamboj

JSONにコメントを追加して末尾のカンマを使用する場合は、以下の実装を使用してください。

var fs = require('fs');

var data = parseJsData('./message.json');

console.log('[INFO] data:', data);

function parseJsData(filename) {
    var json = fs.readFileSync(filename, 'utf8')
        .replace(/\s*\/\/.+/g, '')
        .replace(/,(\s*\})/g, '}')
    ;
    return JSON.parse(json);
}

あなたのJSONに"abc": "foo // bar"のようなものがあると、うまく動かないかもしれないことに注意してください。そうYMMV。

2
Nux

Lodashの試み関数を利用してエラーオブジェクトを返す。エラーオブジェクトはisError関数で処理できる。

// Returns an error object on failure
function parseJSON(jsonString) {
   return _.attempt(JSON.parse.bind(null, jsonString));
}


// Example Usage
var goodJson = '{"id":123}';
var badJson = '{id:123}';
var goodResult = parseJSON(goodJson);
var badResult = parseJSON(badJson);

if (_.isError(goodResult)) {
   console.log('goodResult: handle error');
} else {
   console.log('goodResult: continue processing');
}
// > goodResult: continue processing

if (_.isError(badResult)) {
   console.log('badResult: handle error');
} else {
   console.log('badResult: continue processing');
}
// > badResult: handle error
2
l3x

JSON.parseは、解析しているjson文字列の安全性を保証しません。 json-safe-parse または同様のライブラリを見てください。

Json-safe-parse npmページから: 

JSON.parseはすばらしいのですが、JavaScriptのコンテキストで深刻な欠陥が1つあります。継承されたプロパティをオーバーライドすることを可能にします。信頼されていないソース(例:ユーザー)からJSONを解析していて、そこに存在すると思われる関数を呼び出す場合、これは問題になる可能性があります。

2

JSONソースファイルがかなり大きい場合は、次のようにNode.js 8.0を使用したネイティブのasync/awaitアプローチによる非同期ルートを検討します。

const fs = require('fs')

const fsReadFile = (fileName) => {
    fileName = `${__dirname}/${fileName}`
    return new Promise((resolve, reject) => {
        fs.readFile(fileName, 'utf8', (error, data) => {
            if (!error && data) {
                resolve(data)
            } else {
                reject(error);
            }
        });
    })
}

async function parseJSON(fileName) {
    try {
        return JSON.parse(await fsReadFile(fileName));
    } catch (err) {
        return { Error: `Something has gone wrong: ${err}` };
    }
}

parseJSON('veryBigFile.json')
    .then(res => console.log(res))
    .catch(err => console.log(err))
1
Lae Kettavong
var array={
    Action: 'Login',
    ErrorCode: 3,
    Detail: 'Your account not found.'
};
var http=require('http'),
    PORT=8789,
    server=function(req,res){
        res.writeHead(200,{'Content-Type':'application/json'});

        // JSON
        res.end(JSON.stringify(array));
    }

http.createServer(server).listen(PORT);
console.log('Server started.');
1
vuhung3990

私は fs-extra を使います。コールバックをサポートしているので Promises もサポートしているので、とても気に入っています。そのため、コードをもっと読みやすくすることができます。

const fs = require('fs-extra');
fs.readJson("path/to/foo.json").then(obj => {
    //Do dome stuff with obj
})
.catch(err => {
    console.error(err);
});

また、標準のfsモジュールには含まれていない便利なメソッドもたくさんあり、それに加えて、ネイティブのfsモジュールからメソッドをブリッジしてそれらを約束します。

注:ネイティブのNode.jsメソッドを使用することもできます。それらは約束され、fs-extraにコピーされます。 fs.read()fs.write()のメモを見る 

だからそれは基本的にすべての利点です。私は他の人がこれが役に立つことを願っています。

1
Mig82

JSON.parse(str);を使用してください。もっと読む ここ

ここではいくつかの例を示します。

var jsonStr = '{"result":true, "count":42}';

obj = JSON.parse(jsonStr);

console.log(obj.count);    //expected output: 42
console.log(obj.result);   // expected output: true
0
Praveen Poonia

それ以上のモジュールは必要ありません。
を使うだけ
var parsedObj = JSON.parse(yourObj);
これに関してセキュリティ上の問題があるとは思わない

0
Sachin S

上記の回答で述べたように、文字列をJSONに解析するためにJSON.parse()を使用できますが、解析する前に正しいデータを解析するようにしてください。そうしないとアプリケーション全体が停止する可能性があります。

このように使用しても安全です

let parsedObj = {}
try {
    parsedObj = JSON.parse(data);
} catch(e) {
    console.log("Cannot parse because data is not is proper json format")
}
0
Shekar Mania

安全側にあるためにこれを使用してください

var data = JSON.parse(Buffer.concat(arr).toString());

JSON.parse()を使うことができます(これはおそらくtry-catchステートメントでラップするよう強制する組み込み関数です)。

あるいは、JSON解析のnpmライブラリーを使用してください。 json-parse-or のようなものです。

0
C'estLaVie

NodeJs JavaScript ベースのサーバーなので、純粋に JavaScript ...のようにすることができます。

想像してみてください Json in - NodeJs ...

var details = '{ "name": "Alireza Dezfoolian", "netWorth": "$0" }';
var obj = JSON.parse(details);

そして、あなたはあなたのjsonのパースされたバージョンを得るために上ですることができます...

0
Alireza