使用 PHP cURL 从 API 获取并解析多层级 JSON 数据

花韻仙語
发布: 2025-09-17 11:06:26
原创
181人浏览过

使用 php curl 从 api 获取并解析多层级 json 数据

本文详细讲解如何使用 PHP cURL 发送 API 请求,接收 JSON 响应,并通过 json_decode 解析数据。重点演示了如何遍历多层级数组,精确提取如歌曲标题和艺术家姓名等嵌套字段,提供完整的代码示例和实践指导,帮助开发者高效处理复杂的 API 返回数据。

1. 使用 cURL 发送 API 请求

cURL 是一个强大的命令行工具和库,用于通过各种协议传输数据。在 PHP 中,我们可以使用 cURL 扩展来发起 HTTP 请求,例如从 RESTful API 获取数据。

首先,我们需要初始化 cURL 会话,设置请求的 URL,并指定将响应作为字符串返回而不是直接输出。

<?php
// API 请求的 URL
$url = "https://api.deezer.com/search?q=broken%20strings";

// 初始化 cURL 会话
$ch = curl_init();

// 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url); // 设置请求的 URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将响应作为字符串返回

// 执行 cURL 请求并获取响应
$resp = curl_exec($ch);

// 检查 cURL 请求是否发生错误
if (curl_error($ch)) {
    echo "cURL 错误: " . curl_error($ch);
} else {
    // 请求成功,继续处理响应
    // ...
}

// 关闭 cURL 会话
curl_close($ch);
?>
登录后复制

在上述代码中,CURLOPT_RETURNTRANSFER 设置为 true 是关键,它确保 curl_exec() 返回的是响应内容本身,而不是在屏幕上打印。

2. 解析 JSON 响应

大多数现代 API 都以 JSON (JavaScript Object Notation) 格式返回数据。在 PHP 中,json_decode() 函数用于将 JSON 字符串转换为 PHP 变量。为了方便后续的数据访问,通常会将 JSON 解码为关联数组。

立即学习PHP免费学习笔记(深入)”;

<?php
// ... (cURL 请求部分)

if (curl_error($ch)) {
    echo "cURL 错误: " . curl_error($ch);
} else {
    // 将 JSON 响应解码为 PHP 关联数组
    $decoded = json_decode($resp, true);

    // 检查 JSON 解码是否成功
    if (json_last_error() !== JSON_ERROR_NONE) {
        echo "JSON 解码错误: " . json_last_error_msg();
    } else {
        // 解码成功,可以打印整个数组结构以供调试
        // print_r($decoded);
    }
}

// ... (关闭 cURL 会话)
?>
登录后复制

json_decode($resp, true) 中的 true 参数指示函数返回关联数组,而不是对象。这使得通过字符串键访问数据变得更加直观和方便。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online

3. 遍历并提取多层级数据

API 返回的 JSON 数据通常是嵌套的,意味着一个数组或对象中包含其他数组或对象。根据提供的示例数据结构,主要的记录列表存储在 $decoded['data'] 键下,每个记录本身又是一个包含 title 和 artist 等字段的数组,其中 artist 字段又是一个包含 name 等信息的嵌套数组。

要从所有记录中提取特定的值(例如歌曲标题和艺术家姓名),我们需要遍历 $decoded['data'] 数组,并在每次迭代中深入访问嵌套的键。

<?php
// ... (cURL 请求和 JSON 解码部分)

if (curl_error($ch)) {
    echo "cURL 错误: " . curl_error($ch);
} else {
    $decoded = json_decode($resp, true);

    if (json_last_error() !== JSON_ERROR_NONE) {
        echo "JSON 解码错误: " . json_last_error_msg();
    } else {
        // 确保 'data' 键存在且是一个数组
        if (isset($decoded['data']) && is_array($decoded['data'])) {
            // 遍历 'data' 数组中的每一个记录
            foreach ($decoded['data'] as $record) {
                // 提取歌曲标题
                $title = isset($record['title']) ? $record['title'] : '未知标题';

                // 提取艺术家姓名,需要深入到 'artist' 数组中
                $artistName = isset($record['artist']['name']) ? $record['artist']['name'] : '未知艺术家';

                // 输出提取到的信息
                printf("歌曲标题: %s\n", $title);
                printf("艺术家: %s\n\n", $artistName);
            }
        } else {
            echo "API 响应中未找到 'data' 数组或其格式不正确。\n";
        }
    }
}

// ... (关闭 cURL 会话)
?>
登录后复制

在 foreach ($decoded['data'] as $record) 循环中,每次迭代 $record 变量都会持有当前处理的歌曲记录的完整数组。然后,我们可以通过 $record['title'] 直接访问标题,并通过 $record['artist']['name'] 访问嵌套在 artist 数组中的艺术家姓名。使用 isset() 进行检查是一种良好的编程习惯,可以避免在某些键不存在时产生 PHP 警告或错误。

4. 完整代码示例

将上述所有步骤整合起来,形成一个完整的 PHP 脚本,用于从 Deezer API 获取搜索结果并打印歌曲标题和艺术家姓名:

<?php
// 1. 定义 API 请求的 URL
$url = "https://api.deezer.com/search?q=broken%20strings";

// 2. 初始化 cURL 会话
$ch = curl_init();

// 3. 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将响应作为字符串返回

// 4. 执行 cURL 请求
$resp = curl_exec($ch);

// 5. 检查 cURL 请求是否发生错误
if (curl_error($ch)) {
    echo "cURL 错误: " . curl_error($ch) . "\n";
} else {
    // 6. 将 JSON 响应解码为 PHP 关联数组
    $decoded = json_decode($resp, true);

    // 7. 检查 JSON 解码是否成功
    if (json_last_error() !== JSON_ERROR_NONE) {
        echo "JSON 解码错误: " . json_last_error_msg() . "\n";
    } else {
        // 8. 检查并遍历 'data' 数组
        if (isset($decoded['data']) && is_array($decoded['data'])) {
            echo "--- 搜索结果 ---\n\n";
            foreach ($decoded['data'] as $index => $record) {
                // 9. 提取歌曲标题和艺术家姓名
                $title = isset($record['title']) ? $record['title'] : '未知标题';
                $artistName = isset($record['artist']['name']) ? $record['artist']['name'] : '未知艺术家';

                // 10. 输出提取到的信息
                printf("记录 %d:\n", $index + 1);
                printf("  歌曲标题: %s\n", $title);
                printf("  艺术家: %s\n\n", $artistName);
            }
            echo "-----------------\n";
        } else {
            echo "API 响应中未找到 'data' 数组或其格式不正确。\n";
        }
    }
}

// 11. 关闭 cURL 会话
curl_close($ch);
?>
登录后复制

5. 注意事项与最佳实践

  • 错误处理: 始终检查 curl_error() 和 json_last_error() 以捕获请求和解析过程中可能出现的错误。这对于调试和构建健壮的应用程序至关重要。
  • 数据存在性检查: 在访问数组键之前,使用 isset() 检查键是否存在,尤其是在处理来自外部源(如 API)的数据时。这可以防止在数据结构不完全符合预期时产生 PHP 警告或错误。
  • API 速率限制: 如果频繁请求 API,请注意 API 提供商的速率限制策略,避免因请求过多而被暂时或永久封禁。
  • 安全: 如果您将从 API 获取的数据显示在网页上,请务必进行适当的输出转义(例如使用 htmlspecialchars()),以防止跨站脚本 (XSS) 攻击。
  • 可读性: 对于复杂的嵌套数据,考虑使用辅助函数或类来封装数据访问逻辑,提高代码的可读性和维护性。

通过遵循这些步骤和最佳实践,您可以有效地使用 PHP cURL 从各种 API 获取和解析多层级 JSON 数据,并准确提取所需的信息。

以上就是使用 PHP cURL 从 API 获取并解析多层级 JSON 数据的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号