c – 调用Boost JSON解析器永远不会返回

我在
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(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

我刚刚用JSON文件400Kb做了一个小测试,它运行得很好:

    #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;
    }
点赞