2

json オブジェクトの連続ストリーム (json オブジェクトの配列ではない) を生成するバイナリ アプリケーションがあります。Json オブジェクトは複数の行にまたがることがあります (まだ有効な json オブジェクトですが、整形されています)。

このストリームに接続して、次のような問題なく読み取ることができます。

var child = require('child_process').spawn('binary', ['arg','arg']);

child.stdout.on('data', data => {
  console.log(data);
});

ストリームはバッファであり、いつでもデータ イベントを発行します。したがって、バッファを行に解析するために readline モジュールを使用しました。これは、スパンしない Json オブジェクトに対して機能します (行を JSON.parse() できます)。複数行で。

最適な解決策は、次のような単一の json オブジェクトを返すイベントをリッスンすることです。

child.on('json', object => {

});

ストリーム ノードのドキュメントに objectMode オプションがあることに気付きましたが、ストリームを Buffer 形式で取得しているため、使用できないと思います。

pixl-json-stream、json-stream で npm を見ましたが、私の意見では、これらのどれも目的に適合していません。clarinet-object-stream がありますが、イベントに基づいて json オブジェクトをゼロから構築する必要があります。

私はjsonオブジェクトストリームを制御できません。ほとんどの場合、1つのオブジェクトが1行にありますが、10〜20%のjsonオブジェクトが複数の行(EOLとして\n)にあり、オブジェクト間のセパレーターはありません。新しいオブジェクトはそれぞれ、常に新しい行から始まります。

サンプル ストリーム:

{ "a": "a", "b":"b" }
{ "a": "x",
  "b": "y", "c": "z"
}
{ "a": "a", "b":"b" }

明らかな何かが欠けているだけです。むしろ適切なモジュールを見つけて、このシナリオを処理するためにストリームパーサーを正規表現でハックします。

4

2 に答える 2