Я использую JsonCpp для анализа JSON в C ++.
например
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.
Однако, если бы мне сказали, что фрагмент наверняка станет недействительным со второго n
символа, я мог бы отбросить все в буфере до этой точкии затем просто дождитесь следующего {
, чтобы рассмотреть начало нового объекта как повторную синхронизацию с максимальным усилием.
Итак, есть ли способ, которым я могу попросить JsonCpp сказать мнедействительно ли неполный фрагмент JSON уже гарантирует, что полный «объект» будет синтаксически недействительным?
То есть:
{"name": "sample"} Valid (Json::Reader::parse == true)
{"name": "sam Incomplete (Json::Reader::parse == false)
{"name": "sam"LOL Invalid (Json::Reader::parse == false)
Я хотел бы различать два состояния отказа.
Могу ли я использовать JsonCpp для достижения этой цели, или мне придется написать свой собственный «частичный валидатор» JSON, создав конечный автомат, который считает, какие символы «допустимы» на каждом шаге входной строки?Я бы не стал изобретать велосипед ...