2012-06-19 2 views
4

Linux에서 실행되는 QT 기반 단일 스레드 콘솔 앱은 Boost를 사용하여 JSON 문자열을 구문 분석하며 대용량 JSON을받을 때를 제외하고 일반적으로 정상적으로 작동한다. 유효한 크기의 JSON이 160kb 크기입니다 (!). 구문 분석을 시도하면 Boost의 JSON 구문 분석기에 대한 호출이 반환되지 않습니다. 나는 상당한 시간을두고왔다. 이후에 디버거를 사용하여 휴식, 내 애플 리케이션은 아무 것도 일어나지 않는 것처럼 자신의 메시지 루프에 앉아있다. 이 호출은 예외를 throw하지 않습니다. JSON은 큰 크기를 제외하고는 주목할만한 요소가 아닙니다. 형식이 좋고 ASCII 문자로만 구성되었습니다.부스트 호출 JSON 파서가 전혀 반환되지 않는다

어떻게 실행하면 "포기"하고 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 
    } 
} 
+0

우선 제거하는 것입니다 방정식에서 QT를 사용하고 단지 부스트를 사용하는 작은 프로그램을 작성하십시오. 그래도 실패하면 입력 소스를 가져 와서 실패 할 때까지 작은 샘플로 나눕니다. –

+1

동일한 동작을 보여주는 간단한 자체 프로그램이있는 경우 http://svn.boost.org에서 티켓을 만들고 티켓과 입력 파일을 첨부하십시오. –

답변

2

먼저 두 가지 의견에 동의합니다. 프로그램을 최소화하십시오.

둘째, Qt (stl, boost,이 특정 버전의)가 큰 문자열을 처리 할 수 ​​있는지 확인하려고합니다. 파서가 전체 문자열을 가져 왔는지 확인하십시오.

셋째, 나는 sstream보다는 ostringstream을 사용할 것입니다. :)

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; 
    } 
관련 문제