C++拉取Hypixel API数据时nlohmann json出现parse_error如何解决?
核心问题原因
- 最致命的错误是URL拼接逻辑错误:C++中
std::string与整数直接执行+运算不是字符串拼接,而是将字符串的首地址向后偏移x个字节,导致最终请求的URL完全不符合预期,服务端返回非JSON格式的错误响应,触发nlohmann/json的解析异常。 - 缺少HTTP请求结果校验逻辑:不管请求是否成功、返回的HTTP状态码是否为200,都直接解析响应内容,只要返回非JSON内容就会直接崩溃。
- 无限制高频请求容易触发Hypixel API的限流规则,服务端会直接返回错误页面而非合法JSON数据。
修复后的代码示例
#include <iostream> #include <vector> #include <cpr/cpr.h> #include <nlohmann/json.hpp> #include <Windows.h> int main() { using namespace nlohmann; // 先拉取总页数 auto response = cpr::Get(cpr::Url{ "https://api.hypixel.net/skyblock/auctions" }); // 先校验请求是否成功 if (response.status_code != 200) { std::cout << "拉取总页数失败,状态码:" << response.status_code << std::endl; return -1; } json res = json::parse(response.text); int iNumPages = res["totalPages"]; // 用vector代替裸数组,避免内存管理问题 std::vector<json> arrPages; arrPages.reserve(iNumPages); // 提前预留空间提升性能 for (int x = 0; x < iNumPages; x++) { std::cout << "正在拉取第" << x << "页" << std::endl; // 修复URL拼接:先把整数转成字符串再拼接 std::string url = "https://api.hypixel.net/skyblock/auctions?page=" + std::to_string(x); auto pageRes = cpr::Get(cpr::Url{ url }); // 校验请求状态 if (pageRes.status_code != 200) { std::cout << "拉取第" << x << "页失败,状态码:" << pageRes.status_code << std::endl; // 可根据需求加重试逻辑 Sleep(1000); x--; // 重新拉取当前页 continue; } // 解析前加异常捕获,避免异常直接导致程序崩溃 try { arrPages.push_back(json::parse(pageRes.text)); } catch (const json::parse_error& e) { std::cout << "第" << x << "页解析失败,错误信息:" << e.what() << std::endl; std::cout << "返回内容:" << pageRes.text << std::endl; Sleep(1000); x--; continue; } // 加延迟避免触发限流,可根据API要求调整 Sleep(200); } std::cout << "全部拉取完成,共" << arrPages.size() << "页" << std::endl; // 后续业务逻辑 return 0; }
通用调试思路
- 遇到
nlohmann::detail::parse_error异常时,第一时间打印返回的response.text内容,可直接确认是否返回了错误页面、限流提示等非JSON内容 - 所有HTTP请求都先校验状态码,非200状态下不要执行解析逻辑,直接打印错误信息排查问题
- 涉及字符串拼接的场景,可以先打印拼接后的结果,确认是否符合预期
- 对外API请求一定要加合理延迟,避免触发限流规则导致请求失败
内容的提问来源于stack exchange,提问作者htt5041
相关产品推荐
相关产品推荐

