使用Poco::JSON::Parser解析JSON触发JSONException问题求助
Poco::JSON::Parser解析API返回流触发JSONException排查方案
排查步骤与解决方案
1. 捕获异常获取详细错误信息
当前代码未捕获Poco::JSON::JSONException,无法定位具体错误类型(比如JSON语法错误、非法字符、流读取异常等)。修改代码添加异常捕获:
try { std::istream& page = session.receiveResponse(response); Poco::JSON::Parser parser; Poco::Dynamic::Var result = parser.parse(page); } catch (const Poco::JSON::JSONException& e) { std::cerr << "JSON解析错误: " << e.what() << std::endl; }
异常信息会直接暴露问题核心,比如是否存在未闭合的括号、意外字符等。
2. 检查输入流的状态与读取位置
如果之前打印过page流的内容,流的读取指针会移动到末尾,后续parse调用会读取空内容触发异常。若需要保留流内容解析,打印后需重置流指针:
// 打印流内容后重置指针到起始位置 page.seekg(0, std::ios::beg);
若流为一次性不可重复读取类型,可将流内容复制到本地字符串后再解析:
std::istream& page = session.receiveResponse(response); std::string jsonStr(std::istreambuf_iterator<char>(page), {}); Poco::JSON::Parser parser; try { Poco::Dynamic::Var result = parser.parse(jsonStr); } catch (const Poco::JSON::JSONException& e) { std::cerr << "JSON解析错误: " << e.what() << std::endl; }
3. 验证JSON格式的完整性与合法性
你提供的JSON示例末尾带有...,需确认API返回的是完整且语法合规的JSON:
- 检查是否存在未闭合的大括号/中括号
- 确认字符串是否正确闭合、转义符使用合规
- 排查是否存在UTF-8 BOM头(部分API返回的JSON带BOM,Poco解析器默认不处理,需手动去除)
4. 检查Poco版本兼容性
部分旧版本Poco的JSON解析器对特殊键名(如带点号、空格的键)支持不完善,确认使用的Poco版本是否为稳定新版本,必要时升级。
内容的提问来源于stack exchange,提问作者rawmud
相关产品推荐
相关产品推荐

