javascript 配列 Node.js を使用して JSON を解析する方法は?




nodejs json parse (24)

Node.jsを使用してJSONをどのように解析する必要がありますか? JSONを安全に検証して解析するモジュールがありますか?


簡単ですが、 JSON.stringify(json_obj)を使用してJSONを文字列に変換し、 JSON.parse("your json string")を使用して文字列をJSONに変換できます。


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

Node.jsでの設定にJSONを使用しますか? これを読んで、9000以上の設定スキルを取得してください...

注:data = require( './ data.json')と主張する人。 セキュリティのリスクであり、熱心な熱意で人々の答えを下降させる:あなたはまったく間違っている 。 そのファイルにJSON以外のファイルを置いてみてください...ノードは、手動ファイルの読み込みをコード化するのがずっと遅く、難しく、後続のJSON.parse()を使って同じことをした場合とまったく同じエラーを返します。 間違った情報が広がるのをやめてください。 あなたは世界を傷つけ、助けてはいない。 ノードはこれを可能にするように設計されました。 セキュリティリスクではありません!

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

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

ほとんどの開発者は、サーバーとアプリケーションの設定を変更可能なものとして扱います。 それはできません。 上位レイヤーからの変更を重ねてレイヤーすることはできますが、 基本要件を変更しています 。 いくつかのもの存在する必要があります! configの動作を不変であるようにしてください。なぜなら、基本的にはソースコードのようなものがいくつかあるからです。

起動後にたくさんのものが変更されないことがわからない場合は、try / catchブロックを使用して設定の読み込みを行うようなアンチパターンが発生し、適切に設定されたアプリケーションなしで続けることができます。 あなたはできません。 可能であれば、それはコミュニティ/ユーザ設定層に属し、サーバ/アプリケーション設定層には属しません。 あなたはそれを間違っているだけです。 アプリケーションがブートストラップを終了するときに、オプションのものを重ねて表示する必要があります。

あなたの頭を壁にぶつけないでください:あなたの設定は非常にシンプルでなければなりません。

簡単なjson設定ファイルと単純な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);
}

このパターンを使用すると、起動したアプリケーションの上にコミュニティとユーザーの設定を読み込むことができます。dev opsは、あなたの仕事をコンテナに押し込み、スケールします。 あなたはマルチテナントのために読まれています。 ユーザーランドは隔離されています。 使用しているサービスプロトコル、使用しているデータベースの種類、問題のコードを書くことだけに焦点を当てることができます。

レイヤーを使用しているので、いつでも(レイヤード設定オブジェクト)、あらゆることについて真の単一のソースに頼ることができ、すべてのステップでエラーチェックを避けることができます。適切な設定なしで動作しますか? "


あなたの文字列が実際に有効であるかどうかわからないので、まず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ファイルのためだけに働く。

ファイルのエンディングが異なる場合、これは動作しません!


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



JSONストリームの解析? JSONStream使用し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
    }))

github.com/dominictarr/JSONStream


グローバルなJSONオブジェクトの代替案があることを言いたいと思います。 JSON.parseJSON.stringifyは両方とも同期的なので、大きなオブジェクトを扱う場合は、非同期JSONモジュールのいくつかをチェックアウトしたいと思うかもしれません。

https://github.com/joyent/node/wiki/Modules#wiki-parsers-jsonhttps://github.com/joyent/node/wiki/Modules#wiki-parsers-json : https://github.com/joyent/node/wiki/Modules#wiki-parsers-json


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"ようなものがあれば、 "abc": "foo // bar"というものがうまくいきません。 だからYMMV。


これを安全な側にするために使う

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


誰もがここでJSON.parseについて語ったので、何か他のことを言ってみた。 素晴らしいモジュールがありConnect多くのミドルウェアとConnectして、アプリケーションの開発をより簡単に、より良くすることができます。 ミドルウェアの1つはbodyParserです。 それはJSON、HTMLフォームなどを解析します。また、JSONの解析には特定のミドルウェアしかありませnoop

上のリンクを見て、本当にあなたに役立つかもしれません。


JSONソースファイルがかなり大きい場合は、次のように、Node.js 8.0でネイティブの非同期/待機方法を使用して非同期ルートを検討することができます

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 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);
});

これを可能な限り複雑にし、できるだけ多くのパッケージを持ち込むために...

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を使用するだけの利点は、ファイルがディスクから読み取られている間にノードサーバーが他の要求を処理できることです。


ちょうど答えを完了したい(私はしばらくそれと苦労した)、この例は、Jsonの配列にアクセスすることを示して、jsonの情報にアクセスする方法を示したい:

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);
  }
})


JSON.parseをtry catchブロックで使用するようにしてください 。jsonに破損したデータがある場合、ノードが常に予期しないエラーをスローするので、単純なJSON.Parseの代わりにこのコードを使用してください。

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

他の答えとして言及したように、設定ファイルのように安全で存在するローカルの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を使用できます

JSONオブジェクトは、 ECMAScript 5互換のJavaScript実装で使用することができます。 Node.jsが構築されているV8もその1つです。

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か? もう一度考えてみて!

場合によってrequire使うことができrequire

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

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

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

  1. requireは同期的です。 非常に大きなJSONファイルをお持ちの場合は、イベントループが停止します。 実際には、 JSON.parsefs.readFileを使用する必要があります。
  2. requireはファイルを1回だけ読み込みます。 その後、同じファイルに対してrequireを呼び出すと、キャッシュされたコピーが返されます。 継続的に更新された.jsonファイルを読んでみたい場合は、いい考えではありません。 あなたはハックを使うことができます。 しかし、この時点で、 fs使うのは簡単です。
  3. ファイルに.json拡張子がない場合、 requireはファイルの内容をJSONとして扱いません。

真剣に! JSON.parse使用しJSON.parse

load-json-fileモジュール

多数の.jsonファイルを.jsonでいる場合(そして非常に怠けている場合)、毎回定型文を書くのは面倒です。 load-json-fileモジュールを使用すると、一部の文字を保存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であるかどうかわからない場合は、 try/catchブロック内でJSON.parse()への呼び出しを囲みます。 ユーザーがJSON文字列を指定するとアプリケーションがクラッシュし、セキュリティホールにつながる可能性があります。 外部提供のJSONを解析すると、エラー処理が行われることを確認してください。


JSON.parse()を使うことができます(組み込み関数で、おそらくtry-catch文でラップすることになります)。

または、 json-parse-orようなJSON解析のnpmライブラリを使用します。


JSON.parse("your string");

それで全部です。


.jsonファイルがrequireです。

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

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

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

または(ファイル拡張子は省略できます):

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

require同期で、ファイルを一度だけ読み込み、呼び出しがキャッシュから結果を返すことに注意してください

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


あなたは単にJSON.parse使うことができます。

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

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


JSON.parseは解析しているJSON文字列の安全性を保証しません。 json-safe-parseや同様のライブラリのようなライブラリを見るべきです。

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

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





node.js