我使用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