我使用JsonCpp來解析C++中的JSON。我可以使用JsonCpp部分驗證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。但是,如果我可以告訴我該片段在第二個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「部分驗證器」,該狀態機在輸入字符串的每一步中考慮哪些字符是「有效的」?我寧願不重新發明輪子...
生產者只知道一個完整的JSON對象。分割完全取決於能夠通過網絡傳輸的內容。 – 2012-02-14 10:06:55
(我不希望我們的協議有一個消息長度字段,但實際上,我們_do_必須在每JSON消息,看起來像'鴿子開始定點:JSON:',所以我們可以建立它變成唉也許。在下一個版本中:D) – 2012-02-14 12:00:45
我能夠最終調整格式,生成包含長度標題的協議的替代版本;然而,爲了向後兼容,我仍然需要爲現有格式解決這個問題。 – 2012-02-16 17:04:47