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

PHP解析嵌套JSON遇阻:categories子节点无法输出及URL调用问题

解决PHP解析嵌套JSON元素与远程URL访问问题

让我一步步帮你搞定这两个问题:

一、嵌套categories元素解析错误的原因及修复

首先看你调用的API返回的JSON结构:每个职位条目里的categories是对象类型(不是数组),里面直接包含team、location、commitment这几个键。而你的代码犯了两个错误:

  1. 错误地把categories当成数组用下标(比如[2])访问
  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>

额外说明

  1. 我添加了htmlspecialchars()转义输出内容,这是前端输出的最佳实践,能防止XSS注入攻击
  2. 用?? 'N/A'做兜底处理,避免某个职位缺失字段时页面报错
  3. 如果一定要用file_get_contents,可以检查php.ini里的allow_url_fopen是否设为On,但生产环境还是推荐cURL更可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:54