如何使用 Poco Json 解析器确定输入文档中错误的位置?
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 了解不多,但看一眼代码表明异常有一个"消息"字段,其中包含发生 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类中似乎并不困难。 但并非所有错误都有行号 - 有些是"意外的文件结尾"。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 如何在文档文件夹中创建目录
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 关于类的 Python 文档 - 对C++的引用不正确
- C++/autoconf 等效于文档库要求.txt的要求是什么?
- mbed:使用 USB 文档库编译会导致错误
- C++ VISUAL STUDIO:GLFWwindow没有初始化,即使它是在文档中编写的并且以前工作过
- 使用 yaml-cpp 更新 YAML 文档的节点和值
- 在加载 MSHTML 文档之前从 MSHTML 文档中删除无效的 URL
- 如何在C++中表示JSON文档的递归对象结构?
- 如何查找 Redshift Maya API 文档?
- 如何使用值模板编写文档测试用例?
- 如何使用 Gradle DSL(领域特定语言)上的文档?
- ncurses 找不到任何关于cchar_t的文档
- 提取狮身人面像文档中的C++代码片段
- 关于 API 文档和设备操作 在助手-sdk-cpp 上
- 如何使用 Poco Json 解析器确定输入文档中错误的位置?
- 我正在使用 Xercesc 来解析 xml 文档。我想知道我将如何使用 XML 值作为程序的输入?
- MFC 单文档应用程序用户输入