使用 POCO JSON 进行增量解析
Incremental parse with POCO JSON
我正在使用 POCO 1.6.0。我正在尝试编写一个在原始套接字上接收 JSON 消息并对其进行解析的服务。
然而,POCO 的解析器唯一可行的方法似乎是将整个字符串作为输入,或者 return 解析结果,或者抛出 "Syntax error" 异常。
所以这意味着每次新字节到达套接字时我都必须重新解析整个消息;而且目前还没有办法区分实际的语法错误和它只是一个不完整的消息。
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
}
}
注意:我意识到这个问题可以通过让客户端按照 this thread 中的描述构建整个消息来解决,但是我希望通过只使用一个正确形成的数据包足以定义一个帧(该问题的方法 5)。
目前无法执行您想执行的任何一项操作。但是,它们都是合理的请求并且是可行的,因此将其放在 TODO list 中用于即将发布的版本之一。
我正在使用 POCO 1.6.0。我正在尝试编写一个在原始套接字上接收 JSON 消息并对其进行解析的服务。
然而,POCO 的解析器唯一可行的方法似乎是将整个字符串作为输入,或者 return 解析结果,或者抛出 "Syntax error" 异常。
所以这意味着每次新字节到达套接字时我都必须重新解析整个消息;而且目前还没有办法区分实际的语法错误和它只是一个不完整的消息。
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
}
}
注意:我意识到这个问题可以通过让客户端按照 this thread 中的描述构建整个消息来解决,但是我希望通过只使用一个正确形成的数据包足以定义一个帧(该问题的方法 5)。
目前无法执行您想执行的任何一项操作。但是,它们都是合理的请求并且是可行的,因此将其放在 TODO list 中用于即将发布的版本之一。