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

调用CoinGecko API获取JSON数据时程序异常退出问题排查

问题分析与修复

你的代码存在两个核心问题,直接导致程序崩溃和解析结果异常:

1. JSON结构访问错误

CoinGecko搜索API返回的coins字段是数组类型,而非单个对象。你直接通过data["coins"]["market_cap_rank"]尝试访问数组的键值,这会触发JSON解析的未定义行为,直接导致程序崩溃。

正确的访问逻辑是:先获取coins数组的第一个元素,再读取该元素下的market_cap_rank字段。

2. 缺少请求成功校验

如果HTTP请求失败(比如网络故障、API限流),v.text会是无效的JSON内容,直接解析会抛出异常终止程序。必须先检查请求状态码是否为200(成功状态)。


修复后的代码

#include <cpr/cpr.h>
#include <iostream>
#include <nlohmann/json.hpp>
#include <string>

using json = nlohmann::json;
using namespace cpr;
using namespace std;

int main() {
    auto response = Get(Url{ "https://api.coingecko.com/api/v3/search?query=bitcoin" });
    
    // 先校验请求是否成功
    if (response.status_code != 200) {
        cerr << "请求失败,状态码: " << response.status_code << endl;
        return 1;
    }

    try {
        json data = json::parse(response.text);
        // 定位到coins数组首个元素,读取market_cap_rank
        int rank = data["coins"][0]["market_cap_rank"];
        cout << "Rank: " << rank << endl;
    } catch (const json::parse_error& e) {
        cerr << "JSON解析失败: " << e.what() << endl;
        return 1;
    } catch (const json::type_error& e) {
        cerr << "JSON类型错误: " << e.what() << endl;
        return 1;
    }

    return 0;
}

关键修改说明

  • 新增HTTP状态码检查,确保只有请求成功时才进行JSON解析。
  • 调整JSON访问路径:通过data["coins"][0]定位到首个币种对象,再读取market_cap_rank。
  • 添加try-catch块捕获解析和类型错误,避免程序直接崩溃,同时输出错误信息便于调试。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:40:26