调用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
相关产品推荐
相关产品推荐

