如何使用 Poco Json 解析器确定输入文档中错误的位置?

How to determine the position of an error in the input document with Poco Json Parser?

本文关键字:文档 输入 错误 位置 Poco 何使用 Json      更新时间:2023-10-16

我正在使用 Poco C++ Json 解析器。如果输入文档包含 Json 语法错误,则解析器将引发类型为 Poco::JSON::JSONException 的异常。我的问题是此异常类型不包含有关输入文档中错误位置的任何信息。

但是,用户需要一些关于问题所在的提示,以便他们可以解决它。有什么办法可以得到它吗?

编辑:

例如,如果 JSON 输入如下所示:

{
"objects": [
{
"timestamp: "2019-09-13T01:30:00.000Z",
...

JSONException 的 displayText(( 是:

错误:4:属性名称后应为":">

没有提及行号或列(在输入文档中(。

我正在使用 Poco 1.9.0。

我对 POCO 了解不多,但看一眼代码表明异常有一个"消息"字段,其中包含发生 json 错误的行号 - 以及有关解析错误的其他有用信息。

来自ParserImpl.cpp:

case JSON_ERROR:
{
const char* pErr = json_get_error(_pJSON);
std::string err(pErr ? pErr : "JSON parser error.");
throw JSONException(err);
}

该错误字符串源自 pdjson.c 中的此宏的位置:

#define json_error(json, format, ...)                             
if (!(json->flags & JSON_FLAG_ERROR)) {                       
json->flags |= JSON_FLAG_ERROR;                            
snprintf(json->errmsg, sizeof(json->errmsg),              
"error: %lu: " format,                           
(unsigned long) json->lineno,    <<=== THERE'S YOUR LINE NUMBER
__VA_ARGS__);                                    
} 

因此,异常具有解析器能够向用户建议的所有内容。 捕获JSONExcepton并将exception.message((打印回给用户。 但是,如果您想支持非英语,则可能需要修改。 无论如何,通过对代码进行一些修改,将json->lineno正式包含在JSONException类中似乎并不困难。 但并非所有错误都有行号 - 有些是"意外的文件结尾"。