You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:48:03