2016-12-22 18 views
1

JSONを使用してwebsocketにデータを送信します。時々のWebSocketは一つとして多くのメッセージをrecive、そしてevent.dataは次のようになりますので、私はJSON.Parseとそれを解析することはできません不正なJSONを解析する

{"message1":"message1"}{"message2":"message2"} 

。この問題をどのように処理するのですか?

+7

最高の解決策は、メッセージを連結しないように送信者を修正することです。それがオプションではない場合は、メッセージの構造に関する保証はありますか(有効なJSON以外)? –

+5

問題をソースで常に修正してください。サーバーコードが正しく動作するように修正されると、クライアントでの問題の修正が中断されます。 –

答えて

2

ここでは、連結jsonsを解析するために使用することができ、自動回復JSONパーサの例です:

基本的に

function *multiJson(str) { 
 
    while (str) { 
 
     try { 
 
      yield JSON.parse(str); 
 
      str = ''; 
 
     } catch(e) { 
 
      var m = String(e).match(/position\s+(\d+)/); 
 
      yield JSON.parse(str.slice(0, m[1])); 
 
      str = str.slice(m[1]); 
 
     } 
 
    } 
 
} 
 

 
// 
 

 
let test = '{"message1":"message1"}{"message2":{"nested":"hi}{there"}}"third"[4,5,6]'; 
 

 
for (let x of multiJson(test)) 
 
    console.log(x)

、位置nに構文エラーがありますならば、それはしようとしますnの前にすべてを解析し、それが何であるかを調べる。

+0

ありがとう、私のためにうまく動作します。 –

1

送信側で修正できず、常にこのように見える場合は、修正して'}{''}\n{'に置き換え、改行で分割し、JSON文字列を配列してください。

var array = input.replace('}{', '}\n{').split('\n'); 

あなたの入力は改行が含まれている場合、あなたは別の文字または文字列を使用していることに注意してください:

var array = input.replace('}{', '}==XXX=={').split('==XXX=='); 

をしかし、それはあなたが文字列のどこにも'}{'を持っていないという事実に依存しています、真実ではないかもしれない。

より正確な方法が、難しく、カウントするようになり、文字列の内部ではなく、あなたが{の数として}の同じ数を取得するときに、そこ文字列を分割{}

あなたがしなければならないことは、文字ごとに移動し、引用符で囲まれているかどうかを追跡することです。{はすべてカウンターをインクリメントします。}カウンターを減らしてカウンターがゼロになるたびに入力を分割します。

また、可能な限り}に文字列を分割し、JSONとして部分文字列を解析しようとすると、それが有効であればそれを使用して入力から削除してください。

+0

問題は、送信側では常に1つのオブジェクトとして送信されますが、どういうわけかwebsocketでは何度も呼び出すことができるということです。 –

1

APIを支配している場合は、そのAPIを固定しておくことを強くお勧めします。しかし、あなたがしなければ、読んでください。

"}"は実際にはオプションではないと思います。ネストされたオブジェクトを持つことができ、}文字が文字列の内側にある可能性があるからです。

JSONパーサーが失敗しなくなるまで、1文字から始まる文字列を解析し、文字を1つずつ追加してみてください。つまり、最初のデータを解析します。

正常に解析されたデータの最後にオフセットを移動し、繰り返します。

エレガントなソリューションでも、非常に効率的なソリューションでもないかもしれませんが、標準データフォーマット以外のものもあります。

関連する問題