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 错误的行号 - 沿以及有关解析错误的其他有用信息。
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".
我正在使用 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 错误的行号 - 沿以及有关解析错误的其他有用信息。
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".