如何用PHP解析带Authorization认证的JSON接口并渲染为HTML表格/列表
问题原因
你代码的核心问题是JSON处理逻辑搞反了:
- 调用接口返回的
$data本身就是JSON格式字符串,需要用json_decode()将其转为PHP可操作的数组/对象 - 你错误调用了
json_encode(),相当于把原JSON字符串又做了一次编码,最终得到的是字符串类型,自然无法用数组键名读取Vehicles字段内容
修正后的完整代码
<?php $url = 'https://gw.bilinfo.net/listingapi/api/export'; // 身份认证信息 $auth = base64_encode("demo:ocfB6XzF73"); // 构造HTTP请求上下文 $context = stream_context_create([ 'http' => ['header' => "Authorization: Basic $auth"] ]); // 请求数据,添加错误判断 $data = file_get_contents($url, false, $context); if ($data === false) { die('接口请求失败,请检查网络或认证信息'); } // 把JSON字符串转为关联数组,第二个参数传true才会返回数组格式 $vehiclesData = json_decode($data, true); // 判断JSON解析是否成功,以及Vehicles字段是否存在 if (json_last_error() !== JSON_ERROR_NONE || !isset($vehiclesData['Vehicles'])) { die('JSON数据解析失败,或返回数据格式不符合预期'); } // 构造表格 $temp = "<table border='1'>"; // 加border方便查看效果,不需要可以删掉 // 表头 $temp .= "<tr><th>Bilmodel</th>"; $temp .= "<th>Motor</th>"; $temp .= "<th>Drivmiddel</th></tr>"; // 遍历车辆数据生成表格行,用foreach比for更稳妥 foreach ($vehiclesData['Vehicles'] as $vehicle) { $temp .= "<tr>"; $temp .= "<td>" . htmlspecialchars($vehicle['Model'] ?? '') . "</td>"; $temp .= "<td>" . htmlspecialchars($vehicle['Motor'] ?? '') . "</td>"; $temp .= "<td>" . htmlspecialchars($vehicle['Propellant'] ?? '') . "</td>"; $temp .= "</tr>"; } $temp .= "</table>"; echo $temp; ?>
额外优化说明
- 新增了接口请求、JSON解析的错误校验,避免出现无意义的PHP警告
- 替换for循环为foreach遍历,无需手动计算数组长度,逻辑更简洁
- 输出字段时加了
htmlspecialchars()转义,避免原数据里的特殊字符破坏HTML结构,同时用??语法处理字段不存在的情况,防止报错
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

