5

いくつかの通信エラーが原因で、いくつかの不正な文字を含む JSON 文字列を受信することがあります。 "{messageType\" : \"Test1\", \"from\" : \"F2D0B5C6-9875-46B5-8D4F\"}����1"

これらの不正な文字により、JSON パーサーが機能しなくなります。RapidJSON JSON パーサー (C/C++) を使用しています。これらの不要な文字を文字列から除外し、json 文字列の整合性を検証する方法があれば教えてください。

4

5 に答える 5

2

JSON 文字列内のすべての文字を調べて、正当なセットの一部ではない文字を検索し、それらを削除または空白に置き換える独自の前処理関数をロールすることを検討する必要があると思います。次に、新しく修復された文字列を RapidJSON に渡します。

必要に応じてデータを「パッチアップ」するのではなく、最初に通信の問題が発生したときを検出し (したがって、JSON が不完全または不正確である可能性があります)、破棄してセッション全体を再試行する方がおそらく良いでしょう。ここでは、短期的な問題 (プログラムのクラッシュ) を解決しますが、データの不整合やその他の微妙で診断が難しい問題を簡単に生成する可能性があります。

また、このような文字列の最後にほとんど悪いデータが表示されている場合は、問題が実際に通信にあることを注意深く確認する必要があると思います-ここで指定したケースは、正しく終了されず、追加の文字列バッファのように見えます文字列の末尾のジャンク (初期化されていないメモリ) - おそらく、C++ が割り当てられたバッファをクリア (ゼロに設定) すると予想していましたか?

于 2014-11-06T09:32:44.893 に答える
1

文字列で許可されている文字を一覧表示し、json ストリームの各文字が allowed_string にあることを確認できます。例 :

std::string allowed = "abcdefghijklmnopqrstuvwxyz0123456789.,{}[]\"";
std::string json = "{\"bar\":\"foo\",\"blah\":25}";
for(unsigned long int i = 0; i < json.length(); ++i)
  if(allowed.find(json[i]) == std::string::npos)
    throw IllegalJsonChar(json[i]);
于 2014-11-06T09:38:45.340 に答える