C++ 使用POCO-JSON进行增量解析

C++ 使用POCO-JSON进行增量解析,c++,json,parsing,poco-libraries,C++,Json,Parsing,Poco Libraries,我正在使用POCO 1.6.0。我试图编写一个服务,在原始套接字上接收JSON消息并对其进行解析 然而,POCO解析器工作的唯一方式似乎是将整个字符串作为输入,然后返回解析结果,或者抛出“语法错误”异常 这意味着每当一个新字节到达套接字时,我必须重新解析整个消息;而且目前还无法区分实际的语法错误和不完整的消息 parseChar函数看起来不错,但它是私有的。有没有办法让解析器解析某些消息并保持该状态,以便我可以通过传递更多数据来恢复解析 此外,是否有任何方法可以区分实际语法错误和不完整的消息(最

我正在使用POCO 1.6.0。我试图编写一个服务,在原始套接字上接收JSON消息并对其进行解析

然而,POCO解析器工作的唯一方式似乎是将整个字符串作为输入,然后返回解析结果,或者抛出“语法错误”异常

这意味着每当一个新字节到达套接字时,我必须重新解析整个消息;而且目前还无法区分实际的语法错误和不完整的消息

parseChar
函数看起来不错,但它是私有的。有没有办法让解析器解析某些消息并保持该状态,以便我可以通过传递更多数据来恢复解析

此外,是否有任何方法可以区分实际语法错误和不完整的消息(最好获得有关语法错误确切性质的反馈)

伪代码:

Poco::JSON::Parser parser;
std::string input_buffer;

for(;;)
{
    // (append byte(s) from socket into input_buffer)
    // (return failure if this read times out after 5 seconds)

    parser.reset();
    try
    {
        parser.parse(input_buffer);
        break;
    } 
    catch(Poco::Exception &e)
    {
        // (abort, but we don't know if data incomplete or data malformed
    }
}


注意:我意识到这个问题可以通过让客户机按照中所述对整个消息进行帧化来讨论,但是我希望通过让正确格式的数据包足以定义帧(该问题的方法5)使事情对客户机来说尽可能简单

目前,您想做的任何一件事都无法完成。但是,它们都是合理的要求,而且是可行的,因此这是即将发布的一个版本的主题。

谢谢。我听说你在过去的回答中提到了一个不同的解析器“Poco::Web::JSON”,它实现过吗?是的。最初的实现jn有点幼稚,基于性能非常差的Poco::StringTokenizer。