Node.jsを使用してJSONを解析する方法JSONを安全に検証して解析するモジュールはありますか?
単に JSON.parse
を使うことができます。
JSON
オブジェクト の定義はECMAScript 5仕様 の一部です。 node.jsは、Google Chromeの V8 エンジン上に構築されており、これはECMA標準に準拠しています。したがって、node.jsにはグローバルオブジェクト JSON
もあります。[docs] 。
注 - JSON.parse
は同期方式であるため、現在のスレッドを拘束できます。そのため、大きなJSONオブジェクトを解析する予定の場合は、ストリーミングJSONパーサーを使用してください。
require .jsonファイルを作成できます。
var parsedJSON = require('./file-name');
たとえば、ソースコードファイルと同じディレクトリにconfig.json
ファイルがある場合は、次のようにします。
var config = require('./config.json');
または(ファイル拡張子は省略可能)
var config = require('./config');
require
は 同期 であり、ファイルを読み取るのは once のみで、後続の呼び出しはキャッシュからの結果を返します
また、ファイル内の任意のコードを実行する可能性があるため、これは絶対制御下のローカルファイルに対してのみ使用してください。
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
を使用します。
var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);
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');
しかし、私はいくつかの理由でこれをお勧めしません。
require
は同期です。非常に大きなJSONファイルがあると、それがイベントループを妨げます。あなたは本当にJSON.parse
をfs.readFile
と一緒に使う必要があります。require
はファイル一度だけを読み込みます。同じファイルに対してrequire
を続けて呼び出すと、キャッシュコピーが返されます。継続的に更新される.json
ファイルを読みたいのであればお勧めできません。あなたは a hack を使うことができます。しかしこの時点では、単にfs
を使うほうが簡単です。.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コンテンツが完全にストリーミングされるまで、それはあなたのプロセッサを拘束し、あなたのイベントループを詰まらせるでしょう。
たくさんのNPM で利用可能なパッケージがあります。あなたに最適なものを選んでください。
JSON.parse()
に渡されるものが 有効なJSON であるかどうかわからない場合は、JSON.parse()
への呼び出しをtry/catch
ブロックで囲むようにしてください。ユーザー提供のJSON文字列はアプリケーションをクラッシュさせ、セキュリティホールにつながる可能性もあります)。外部提供のJSONを解析する場合は、エラー処理が確実に行われるようにしてください。
JSON.parse(str);
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);
});
グローバルなJSONオブジェクトに代わるものがあることを述べたいのですが。 JSON.parse
とJSON.stringify
はどちらも同期なので、大きなオブジェクトを扱うのであれば、非同期のJSONモジュールのいくつかを調べたいと思うかもしれません。
見てください: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
node-fs
ライブラリをインクルードしてください。
var fs = require("fs");
var file = JSON.parse(fs.readFileSync("./PATH/data.json", "utf8"));
'fs'ライブラリの詳細については、 http://nodejs.org/api/fs.html のドキュメントを参照してください。
あなたはあなたの文字列が実際に有効であることを知らないので、私は最初に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)
}
})
}
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
}))
JSON.parse("your string");
それで全部です。
ここでの他の答えが述べているように、あなたはおそらくあなたが安全で存在していることが分かっているローカルの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
あなたはコードを修正してその影響を見ることができます...
ここのみんながJSON.parseについて言ったので、私は他の何かを言うことを考えました。 Connect アプリの開発をより簡単にそしてより良くするための多くのミドルウェアを備えた素晴らしいモジュールがあります。ミドルウェアの1つは bodyParser です。 JSON、html-formsなどを解析します。JSON解析専用の特定のミドルウェア noop もあります。
上記のリンクを見てください、それはあなたにとって本当に役に立つかもしれません。
私の解決策:
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);
});
Node.jsでの設定にJSONを使用していますか?これを読んで、9000を超える構成スキルを身につけてください...
注:data = require( './ data.json');と主張する人々はセキュリティリスクであり、熱心な熱意で人々の答えを下げます。あなたは正確かつ完全にwrongです。そのファイルに非JSONを配置してみてください... Nodeはエラーを表示します。exactlymuchで同じことをした場合のように=手動でファイルを読み取ってからJSON.parse()をコーディングするのが遅くて難しくなります。誤った情報の拡散を停止してください。あなたは助けではなく、世界を傷つけています。 Nodeは、これを許可するようにdesigned; これはセキュリティ上のリスクではありません!
適切なアプリケーションは、3 +layersの構成で提供されます。
ほとんどの開発者は、サーバーとアプリの構成を変更できるかのように扱います。できません。 レイヤーの変更上位のレイヤーを重ねることができますが、基本要件の変更です。いくつかのもの必要存在する!基本的にはソースコードと同じように、いくつかの設定が不変のように動作するようにします。
起動後に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適切な設定なしで動作しますか?!?」。
(私はしばらくの間それに苦労したように)ちょうど答えを完成させたい、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);
}
})
これをできるだけ複雑にして、できるだけ多くのパッケージを取り込むために...
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サーバが他の要求を処理できることです。
JSONに破損したデータがある場合は、必ず try catch blockでJSON.parseを必ず使用してください。ノードに予期しないエラーが発生するため、単純なJSON.Parseではなくこのコードを使用してください
try{
JSON.parse(data)
}
catch(e){
throw new Error("data is corrupted")
}
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。
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
JSON.parseは、解析しているjson文字列の安全性を保証しません。 json-safe-parse または同様のライブラリを見てください。
Json-safe-parse npmページから:
JSON.parseはすばらしいのですが、JavaScriptのコンテキストで深刻な欠陥が1つあります。継承されたプロパティをオーバーライドすることを可能にします。信頼されていないソース(例:ユーザー)からJSONを解析していて、そこに存在すると思われる関数を呼び出す場合、これは問題になる可能性があります。
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))
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.');
私は 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()
のメモを見る
だからそれは基本的にすべての利点です。私は他の人がこれが役に立つことを願っています。
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
それ以上のモジュールは必要ありません。
を使うだけvar parsedObj = JSON.parse(yourObj);
これに関してセキュリティ上の問題があるとは思わない
上記の回答で述べたように、文字列をJSONに解析するためにJSON.parse()
を使用できますが、解析する前に正しいデータを解析するようにしてください。そうしないとアプリケーション全体が停止する可能性があります。
このように使用しても安全です
let parsedObj = {}
try {
parsedObj = JSON.parse(data);
} catch(e) {
console.log("Cannot parse because data is not is proper json format")
}
安全側にあるためにこれを使用してください
var data = JSON.parse(Buffer.concat(arr).toString());
JSON.parse()を使うことができます(これはおそらくtry-catchステートメントでラップするよう強制する組み込み関数です)。
あるいは、JSON解析のnpmライブラリーを使用してください。 json-parse-or のようなものです。
NodeJs は JavaScript ベースのサーバーなので、純粋に JavaScript ...のようにすることができます。
想像してみてください Json in - NodeJs ...
var details = '{ "name": "Alireza Dezfoolian", "netWorth": "$0" }';
var obj = JSON.parse(details);
そして、あなたはあなたのjsonのパースされたバージョンを得るために上ですることができます...