PHP解析嵌套JSON遇阻:categories子节点无法输出及URL调用问题
解决PHP解析嵌套JSON元素与远程URL访问问题
让我一步步帮你搞定这两个问题:
一、嵌套categories元素解析错误的原因及修复
首先看你调用的API返回的JSON结构:每个职位条目里的categories是对象类型(不是数组),里面直接包含team、location、commitment这几个键。而你的代码犯了两个错误:
- 错误地把
categories当成数组用下标(比如[2])访问 - 混用了数组语法(
[])和对象语法(->)——因为你用了json_decode($data, true),第二个参数为true时,解析结果是关联数组,所有元素必须用数组方式访问
正确的访问方式应该是:
- 团队:
$character['categories']['team'] - 地点:
$character['categories']['location'] - 工作模式:
$character['categories']['commitment']
二、远程URL无法访问的解决方案
用file_get_contents访问远程URL失效,大概率是因为PHP配置里的allow_url_fopen被禁用了(很多服务器为了安全默认关闭这个选项)。更稳定的替代方案是使用cURL,它不受这个配置限制,还能处理更多复杂的HTTP请求场景。
修正后的完整代码
<?php // 使用cURL获取远程JSON数据,替代file_get_contents $url = 'https://api.lever.co/v0/postings/leverdemo?skip=1&limit=3&mode=json'; $ch = curl_init($url); // 设置cURL选项:返回结果而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 临时关闭SSL验证(仅测试用,生产环境建议开启并配置信任证书) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $data = curl_exec($ch); curl_close($ch); // 解析JSON为关联数组 $jobs = json_decode($data, true); // 检查JSON解析是否成功 if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解析失败: ' . json_last_error_msg()); } ?> <table> <thead> <tr> <th>Job title</th> <th>Team</th> <th>Location</th> <th>Commitment</th> <th>Description</th> <th>Apply URL</th> </tr> </thead> <tbody> <?php foreach ($jobs as $job) : ?> <tr> <!-- 用htmlspecialchars转义输出,防止XSS攻击 --> <td><?php echo htmlspecialchars($job['text']); ?></td> <!-- 用??做空值兜底,避免字段不存在时报错 --> <td><?php echo htmlspecialchars($job['categories']['team'] ?? 'N/A'); ?></td> <td><?php echo htmlspecialchars($job['categories']['location'] ?? 'N/A'); ?></td> <td><?php echo htmlspecialchars($job['categories']['commitment'] ?? 'N/A'); ?></td> <td><?php echo htmlspecialchars(substr($job['descriptionPlain'], 0, 100)) . '...'; ?></td> <td><a href="<?php echo htmlspecialchars($job['applyUrl']); ?>" target="_blank">Apply Now</a></td> </tr> <?php endforeach; ?> </tbody> </table>
额外说明
- 我添加了
htmlspecialchars()转义输出内容,这是前端输出的最佳实践,能防止XSS注入攻击 - 用
?? 'N/A'做兜底处理,避免某个职位缺失字段时页面报错 - 如果一定要用
file_get_contents,可以检查php.ini里的allow_url_fopen是否设为On,但生产环境还是推荐cURL更可靠
内容的提问来源于stack exchange,提问作者dubbs
相关产品推荐
相关产品推荐

