如何用PHP处理嵌套JSON:读取文件JSON、解析并转换为HTML?
嘿,这个问题我太熟了!咱们一步步拆解,从读取JSON文件到解析嵌套结构,再转换成美观的HTML,结合你给的具体JSON数据,给你整得明明白白:
步骤1:读取并解析JSON文件
首先得把存储在文件里的JSON内容读进来,PHP里用file_get_contents()就很方便,然后用json_decode()把JSON字符串转成PHP能处理的关联数组(第二个参数设为true)。别忘了加个错误检查,避免文件读取失败或者JSON格式出错的情况:
// 读取JSON文件内容 $jsonContent = file_get_contents('your-file.json'); if (!$jsonContent) { die('哎呀,无法读取JSON文件,请检查文件路径是否正确!'); } // 解析为关联数组,方便后续操作 $data = json_decode($jsonContent, true); // 检查解析是否成功 if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解析出错啦:' . json_last_error_msg()); }
步骤2:提取目标嵌套数据
看你给的JSON结构,核心的房产数据藏在RETS > RED > REP > ResiProp这个嵌套路径里,而且ResiProp是一个数组,每个元素里的all字段才是具体的房产信息。咱们先把这部分数据提取出来,顺便做个空值判断,防止没有数据的时候报错:
// 提取ResiProp数组,用??运算符做容错处理 $resiProps = $data['RETS']['RED']['REP']['ResiProp'] ?? []; if (empty($resiProps)) { echo '<p>暂时没有找到房产数据哦~</p>'; exit; }
步骤3:把嵌套数据转成HTML
接下来就是把提取到的房产数据转换成用户能看懂的HTML了。这里我用卡片式布局举例子(你也可以改成表格或者列表,按需调整),重点是遍历ResiProp数组,把每个字段渲染出来,还要注意安全转义(用htmlspecialchars()防止XSS攻击):
比如你给的Remarks字段是用分号分隔的字符串,咱们可以把它转成子列表,看起来更清晰:
// 开始生成HTML内容 echo '<div class="property-list">'; foreach ($resiProps as $prop) { $property = $prop['all']; // 处理备注字段,拆分成分号分隔的列表项 $remarks = !empty($property['Remarks']) ? explode(';', $property['Remarks']) : []; $remarks = array_map('trim', $remarks); // 去掉每个项前后的空格 echo '<div class="property-card">'; echo '<h3>' . htmlspecialchars($property['Address']) . '</h3>'; echo '<ul>'; echo '<li><strong>更新时间:</strong>' . htmlspecialchars($property['IdxUpdtedDt']) . '</li>'; echo '<li><strong>空调配置:</strong>' . htmlspecialchars($property['H']) . '</li>'; echo '<li><strong>备注:</strong>'; if (!empty($remarks)) { echo '<ul>'; foreach ($remarks as $note) { if (!empty($note)) { // 跳过空的备注项 echo '<li>' . htmlspecialchars($note) . '</li>'; } } echo '</ul>'; } else { echo '无'; } echo '</li>'; echo '</ul>'; echo '</div>'; } echo '</div>';
几个关键注意点
- 安全第一:所有输出到HTML的内容都要用
htmlspecialchars()转义,避免恶意脚本注入(XSS攻击),尤其是像地址、备注这类可能包含特殊字符的字段。 - 容错处理:用
??运算符或者isset()检查每个嵌套字段是否存在,万一JSON结构有变化,也不会直接报错。 - 样式自定义:我给的卡片样式只是参考,你可以根据自己的需求修改CSS,改成表格、网格或者其他布局都没问题。
完整的可运行代码
把上面的步骤整合起来,加上基础的HTML结构和CSS样式,直接就能运行:
<?php // 读取JSON文件 $jsonContent = file_get_contents('your-file.json'); if (!$jsonContent) { die('无法读取JSON文件,请检查文件路径'); } // 解析JSON为关联数组 $data = json_decode($jsonContent, true); if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解析错误:' . json_last_error_msg()); } // 提取目标数据 $resiProps = $data['RETS']['RED']['REP']['ResiProp'] ?? []; ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>房产信息列表</title> <style> .property-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; padding: 20px; max-width: 1200px; margin: 0 auto; } .property-card { border: 1px solid #e0e0e0; border-radius: 8px; padding: 18px; box-shadow: 0 2px 6px rgba(0,0,0,0.05); background-color: #fff; } .property-card h3 { margin-top: 0; color: #2d3748; font-size: 1.2rem; } ul { list-style: none; padding-left: 0; margin-top: 10px; } li { margin-bottom: 8px; color: #4a5568; } li strong { color: #2d3748; } .property-card ul ul { margin-top: 5px; padding-left: 15px; list-style-type: disc; } </style> </head> <body> <h1 style="text-align: center; color: #2d3748; margin-top: 30px;">房产信息列表</h1> <?php if (empty($resiProps)): ?> <p style="text-align: center; color: #718096;">暂无房产数据</p> <?php else: ?> <div class="property-list"> <?php foreach ($resiProps as $prop): ?> <?php $property = $prop['all']; ?> <div class="property-card"> <h3><?= htmlspecialchars($property['Address']) ?></h3> <ul> <li><strong>更新时间:</strong><?= htmlspecialchars($property['IdxUpdtedDt']) ?></li> <li><strong>空调配置:</strong><?= htmlspecialchars($property['H']) ?></li> <li><strong>备注:</strong> <?php $remarks = !empty($property['Remarks']) ? array_map('trim', explode(';', $property['Remarks'])) : []; if (!empty($remarks)): ?> <ul> <?php foreach ($remarks as $note): ?> <?php if (!empty($note)): ?> <li><?= htmlspecialchars($note) ?></li> <?php endif; ?> <?php endforeach; ?> </ul> <?php else: ?> 无 <?php endif; ?> </li> </ul> </div> <?php endforeach; ?> </div> <?php endif; ?> </body> </html>
内容的提问来源于stack exchange,提问作者rsethi
相关产品推荐
相关产品推荐

