
本文详解如何使用 php + curl 正确获取并解码嵌套 json api 响应,定位并提取深层键(如 `data.rates.usd`),避免常见的“undefined index”错误。
在调用类似 Coinbase 的汇率 API 时,返回的 JSON 数据往往具有多层嵌套结构。例如以下响应:
{"data":{"currency":"TRX","rates":{"AED":"0.22938983227","USD":"0.06245299"}}}初学者常误以为解码后可直接通过 $json['USD'] 访问美元汇率,但实际结构是:
$json → ['data'] → ['rates'] → ['USD']
因此,直接访问 $json['USD'] 必然触发 Notice: Undefined index: USD 错误。
✅ 正确解析步骤
-
发起 cURL 请求并启用错误检测(推荐):
$url = "https://api.coinbase.com/v2/exchange-rates?currency=TRX"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 生产环境请务必启用证书验证 curl_setopt($ch, CURLOPT_TIMEOUT, 10); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($result === false || $httpCode !== 200) { throw new RuntimeException("cURL failed: " . curl_error($ch) . " (HTTP $httpCode)"); } -
安全解码 JSON 并验证结构:
$json = json_decode($result, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new RuntimeException("Invalid JSON response"); } // ✅ 正确路径:逐层访问嵌套数组 $usdRate = $json['data']['rates']['USD'] ?? null; if ($usdRate === null) { throw new RuntimeException("Expected 'data.rates.USD' not found in response"); } echo "TRX to USD rate: " . $usdRate; // 输出:TRX to USD rate: 0.06245299
? 调试技巧:可视化 JSON 结构
开发阶段强烈建议使用 print_r() 或 var_dump() 查看完整结构:
echo ""; print_r($json); echo "";或借助在线工具(如 JsonFormatter)格式化原始响应,快速确认键路径。
⚠️ 注意事项
- 永远不要跳过错误检查:curl_exec() 可能返回 false;json_decode() 失败时返回 null。
- 使用空合并运算符 ?? 提供默认值,避免未定义索引警告。
- 生产环境禁用 CURLOPT_SSL_VERIFYPEER => false,应配置 CA 证书(如 curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'))。
- 若需健壮性,可封装为可复用函数:
function getNestedValue($array, $path, $default = null) { foreach (explode('.', $path) as $key) { if (!is_array($array) || !isset($array[$key])) return $default; $array = $array[$key]; } return $array; } // 使用:getNestedValue($json, 'data.rates.USD')
掌握嵌套 JSON 的路径访问逻辑,是 PHP 接口开发的基础能力——关键在于「先看清结构,再精准取值」。










