2016-04-23 8 views
1

jsonオブジェクトの連続ストリーム(jsonオブジェクトの配列ではありません)を生成するバイナリアプリケーションがあります。 Jsonオブジェクトは、複数の行にまたがっていることがあります(まだ有効なjsonオブジェクトですが、prettified)。オブジェクトごとにJSONオブジェクトのストリームを読み取る方法

私はこのストリームに接続するなどの問題もなく、それを読むことができます:

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

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

ストリームはバッファであり、彼らしてくださいが、それゆえ私はラインにバッファを解析するために、readlineのモジュールでプレイするたびにデータイベントを発行し、複数の行にまたがっていないJsonオブジェクトの場合は動作します(私はJSON.parse()行を使用できます)。私は、私は私を信じて、私は「バッファ形式でストリームを取得しかし、ストリームノードのドキュメントのオブジェクトモードオプションに気づいた

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

}); 

最適なソリューションは、単一のJSONオブジェクトを返すイベントに何かを聞くことであろうそれを使うことができません。

pixl-json-stream、json-streamでnpmを見たが、私の意見ではこれらのどれも目的に合っていなかった。クラリネットオブジェクトストリームがありますが、イベントに基づいてjsonオブジェクトを基礎から構築する必要があります。

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

サンプルストリーム:

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

すでに私は何かを明らかに欠けているソリューションが存在する必要があります。むしろ適切なモジュールを見つけて、このシナリオを処理するためにストリームパーサーをregexpでハックするでしょう。

+0

複数のJSONオブジェクトが1行で重複することがありますか? – lipp

+0

新しいオブジェクトは常に上記の情報に従って新しい行で開始します。しかし、オブジェクトの終わりはどこでもかまいません。最後の値の直後には1つの閉じた中かっこがあります。 – TimB

答えて

1

私はすべての行を解析しようとするお勧めします:

const readline = require('readline'); 

const rl = readline.createInterface({ 
input: child.stdout 
}); 

var tmp = '' 
rl.on('line', function(line) { 
    tmp += line 
    try { 
    var obj = JSON.parse(tmp) 
    child.emit('json', obj) 
    tmp = '' 
    } catch(_) { 
    // JSON.parse may fail if JSON is not complete yet 
    } 
}) 

child.on('json', function(obj) { 
    console.log(obj) 
}) 

子供が持つEventEmitterあるので、一つは(OBJ、 'JSON')child.emitを単に呼び出すことができます。

+0

面白い:) 2つの同一の答えが来たが、あなたの前に:) –

+0

readlineインターフェイスを作成するときにoutptutを代わりに使用する必要があります。 –

+0

うん、面白い!ありがとう! – lipp

関連する問題