大きな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([**/./**]);
誰かがそれを手伝ってくれる?
警告:この回答が書かれたので、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
});
JSONstreamは、多くのJSONオブジェクトではなく、単一の巨大なJSONオブジェクトを解析することを目的としています。ストリームを改行で分割してから、JSONとして解析します。
NPMパッケージ split はこの分割を行うと主張しており、 JSON行を解析する機能 もあります。