Poco Json Parser 如何判断输入文档中的错误位置?

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

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

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

编辑:

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

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

JSONException 的 displayText() 是:

错误:4:在 属性 名称

之后应为 ':'

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

我正在使用 Poco 1.9.0。

我对 POCO 了解不多,但看一眼代码表明异常有一个 "message" 字段,其中包含发生 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 class 中似乎并不困难。但并非所有错误都有行号 - 有些是 "unexpected end of file".