c++ - 当 JSON 中存在非法字符时,如何防止 JSON 解析器崩溃?

标签 c++ c json rapidjson

由于一些通信错误,我有时会收到带有一些非法字符的 JSON 字符串: "{messageType\":\"Test1\",\"from\":\"F2D0B5C6-9875-46B5-8D4F\"}����1"

这些非法字符使我的 JSON 解析器崩溃。我正在使用 RapidJSON JSON 解析器 (C/C++)。 你能告诉我是否有一种方法可以从字符串中过滤掉这些不需要的字符并验证 json 字符串的完整性。

最佳答案

这不是解析器中的错误。解析器验证空终止符之前的尾随字符是否为空格。并在发生错误时返回错误代码。但是如果没有空终止符,可能会导致段错误,类似于strlen()

在较新版本的 RapidJSON 中,有一个 kParseStopWhenDoneFlag。启用后,解析器将停止读取完整的 JSON 值后的尾随字符。例如

Document d;
const char* s =
    "{messageType\" : \"Test1\", \"from\" : \"F2D0B5C6-9875-46B5-8D4F\"}����1";
d.Parse<kParseStopWhenDoneFlag>(s);
assert(!d.HasParseError());

通过使用此标志,解析器将在读取 后停止,而不会报告错误。

指南中尚未记录。请引用https://github.com/miloyip/rapidjson/pull/83中的讨论

关于c++ - 当 JSON 中存在非法字符时,如何防止 JSON 解析器崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775819/

相关文章:

c++ - 如何在类/对象C++中使用复数

c - 如何在 C 中处理命令行参数?

C 通过值或指针传递引用

javascript - 使用 Gson 将 Javascript/Json 日期字符串转换为 Java 日期

c# - 使用 Json.net 将大量数据流式传输为 JSON 格式

c# - 使用 json 文件的 Asp.net Core 本地化

c++ - char& operator[] 重载引用返回? (链表)

python - 使用 boost::python 将数据缓冲区放入 C++

c++ - 我如何告诉 cmake 在哪里输出它的构建数据?

C 基本 scanf 不工作