调用 Boost JSON 解析器永远不会返回
Posted
技术标签:
【中文标题】调用 Boost JSON 解析器永远不会返回【英文标题】:Call to Boost JSON parser never returns 【发布时间】:2012-06-19 14:59:34 【问题描述】:我在 Linux 上运行的基于 QT 的单线程控制台应用程序使用 Boost 解析 JSON 字符串,并且它正常工作,除非接收到非常大的 JSON 块。我有一个大小约为 160kb 的有效 JSON(!),当我尝试解析它时,对 Boost 的 JSON 解析器的调用永远不会返回。我已经离开了很长一段时间。如果我随后中断使用调试器,我的应用程序就会闲置在它的消息循环中,就好像什么都没发生一样。该调用不会引发异常。除了大尺寸之外,JSON 没有什么值得注意的地方——它的格式很好并且完全由 ASCII 字符组成。
执行如何才能简单地“放弃”并返回QT消息循环?
void IncomingRequestHandler::OnRequest(const QString& message)
try
std::stringstream ss;
ss << message.toStdString();
boost::property_tree::ptree requestObject;
cout << "Before read_json" << endl; // Gets here
boost::property_tree::json_parser::read_json(ss, requestObject);
cout << "After read_json" << endl; // Never gets here
// ... Some other code ...
catch (const boost::property_tree::json_parser::json_parser_error& e)
cout << "Invalid JSON" << endl; // Never gets here
catch (const std::runtime_error& e)
cout << "Invalid JSON" << endl; // Never gets here
catch (...)
cout << "Invalid JSON" << endl; // Never gets here
【问题讨论】:
我要尝试的第一件事是从等式中删除 QT 并构建一个仅使用 boost 的小程序。如果仍然失败,那么我会将您的输入源拆分为更小的样本,直到您找到失败的地方。 当您有一个显示相同行为的简单、自包含程序时,您可以在 svn.boost.org 创建一个工单并将程序和输入文件附加到工单。 【参考方案1】:首先,我同意上面的两个 cmets:尽量最小化你的程序。
其次,我会尝试检查 Qt(stl,boost,这个特定版本的任何东西)是否可以处理那么大的字符串。确保您的解析器获取整个字符串。
第三,我会使用 ostringstream 而不是 sstream。 :)
根据 boost 文档,解析器返回错误的唯一方法似乎是在您的 property_tree 中返回错误信息。如果它一直持续读取,则可能意味着它正在读取超出实际 JSON 数据的垃圾并卡在上面。
最后,read_json 可以接受文件名,那么为什么还要费心读取文件和创建流呢?你为什么不试试这个:
boost::property_tree::ptree requestObject;
cout << "Before read_json" << endl; // Gets here
boost::property_tree::json_parser::read_json(jsonFileName.toStdString(),
requestObject);
cout << "After read_json" << endl; // Never gets here
我刚刚对 400Kb 大的 JSON 文件进行了一个小测试,它运行良好:
#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using namespace std;
int main(int argc, char* argv[])
string infname = argv[1];
boost::property_tree::ptree requestObject;
cout << "Before read_json" << endl; // Gets here
boost::property_tree::json_parser::read_json(infname, requestObject);
cout << "After read_json" << endl; // Works fine
return 0;
【讨论】:
以上是关于调用 Boost JSON 解析器永远不会返回的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 json 解析器的 boost property_tree 创建空数组节点