web-dev-qa-db-ja.com

node.jsのJSONStreamモジュールによって改行で区切られた大きなJSONファイルを解析する方法は?

大きなjsonファイルがあります。これは改行で区切られたJSONで、複数の標準JSONオブジェクトが余分な改行で区切られています。

{'name':'1','age':5}
{'name':'2','age':3}
{'name':'3','age':6}

現在、node.jsでJSONStreamを使用して大きなjsonファイルを解析しています。JSONStreamを使用する理由は、ストリームに基づいているためです。

ただし、例の両方の解析構文は、各行に分離されたJSONを使用してこのjsonファイルを解析するのに役立ちません

var parser = JSONStream.parse(**['rows', true]**);
var parser = JSONStream.parse([**/./**]);

誰かがそれを手伝ってくれる?

21
user824624

警告:この回答が書かれたので、JSONStreamライブラリの作成者 ルートイベントの発行機能を削除しました 、明らかにメモリーリーク。このライブラリの将来のユーザーは、ルートの発行機能が必要な場合は0.x.xバージョンを使用できます。

以下は変更されていない元の回答です

readme から:

JSONStream.parse(path)

pathは、プロパティ名、正規表現、ブール値、関数の配列である必要があります。パスに一致するオブジェクトはすべて'data'として出力されます。

'root'イベントは、すべてのデータが受信されると発行されます。 'root'イベントは、ルートオブジェクトと一致したオブジェクトの数を渡します。

あなたの場合、特定のプロパティではなくJSONオブジェクトを取得したいので、'root'イベントを使用し、パスを指定する必要はありません。

コードは次のようになります。

var fs = require('fs'),
    JSONStream = require('JSONStream');

var stream = fs.createReadStream('data.json', {encoding: 'utf8'}),
    parser = JSONStream.parse();

stream.pipe(parser);

parser.on('root', function (obj) {
  console.log(obj); // whatever you will do with each JSON object
});
17
frangio

JSONstreamは、多くのJSONオブジェクトではなく、単一の巨大なJSONオブジェクトを解析することを目的としています。ストリームを改行で分割してから、JSONとして解析します。

NPMパッケージ split はこの分割を行うと主張しており、 JSON行を解析する機能 もあります。

2
rjmunro