JsonCppを使用してC++でJSONを解析しています。
例えば
Json::Reader r;
std::stringstream ss;
ss << "{\"name\": \"sample\"}";
Json::Value v;
assert(r.parse(ss, v)); // OK
assert(v["name"] == "sample"); // OK
しかし、私の実際の入力はJSONメッセージのストリーム全体であり、任意のサイズのチャンクで到着する可能性があります。私にできることは、JsonCppに入力を文字ごとに解析させ、JSONメッセージを見つけたら完全に使い果たしてしまうことだけです。
Json::Reader r;
std::string input = "{\"name\": \"sample\"}{\"name\": \"aardvark\"}";
for (size_t cursor = 0; cursor < input.size(); cursor++) {
std::stringstream ss;
ss << input.substr(0, cursor);
Json::Value v;
if (r.parse(ss, v)) {
std::cout << v["name"] << " ";
input.erase(0, cursor);
}
} // Output: sample aardvark
これはすでに少し厄介ですが、さらに悪化します。また、入力の一部が欠落している場合(何らかの理由で)に再同期できる必要があります。
これでロスレスである必要はありませんが、次のような入力がパーサーを永久に壊す可能性を防ぎたいと思います。
{"name": "samp{"name": "aardvark"}
この入力をJsonCppに渡すことは失敗しますが、バッファーにさらに多くの文字を受け取るので、その問題は解消されません。その秒は、その前の秒name
の直後は単に無効"
です。有効なJSONを提示するためにバッファーを完了することはできません。
ただし、2番目の文字の時点でフラグメントが確実に無効になると言えば、その時点までのすべてをバッファにドロップし、次のオブジェクトが新しいオブジェクトの開始を検討するのをn
待つのが最善です。 {
-努力の再同期。
それで、JSONの不完全なフラグメントが完全な「オブジェクト」が構文的に無効になることをすでに保証しているかどうかをJsonCppに教えてもらう方法はありますか?
あれは:
{"name": "sample"} Valid (Json::Reader::parse == true)
{"name": "sam Incomplete (Json::Reader::parse == false)
{"name": "sam"LOL Invalid (Json::Reader::parse == false)
2つの失敗国家を区別したいと思います。
これを実現するためにJsonCppを使用できますか、それとも、入力文字列の各ステップでどの文字が「有効」であるかを考慮するステートマシンを構築して、独自のJSON「部分バリデーター」を作成する必要がありますか?車輪の再発明はしたくない...