如何降低JSON数组深度?PHP脚本生成无效JSON问题排查
问题分析与解决方案
我一眼就看出问题所在了——你在循环里每次迭代都输出一次JSON,这就导致最终的输出是多个独立的JSON对象拼接在一起,而标准的JSON解析器只能处理单一的JSON结构(要么是一个对象,要么是一个数组),所以才会出现无法解码的错误。比如你给出的输出示例:
{"url":["Alternatif Cibubur"]}{"url":["Altern...
这其实是两个JSON对象直接连在一起,完全不符合JSON规范,自然无法被正常解析。
修正后的代码
我们只需要调整逻辑:先把所有数据收集到数组中,最后一次性输出完整的JSON结构,而不是循环内重复输出。
<?php // 获取远程JSON数据 $uri = file_get_contents('http://lewatmana.com/peta/pois/'); $json = json_decode($uri, true); // 初始化存储结果的数组 $response['url'] = []; // 遍历原始JSON数组,收集所有name值 foreach ($json as $item) { $response['url'][] = $item['name']; } // 最后一次性输出合法的JSON echo json_encode($response); ?>
关键改进点
- 避免循环内输出:只在数据收集完成后,统一输出一次JSON,保证结果是单一合法的JSON对象。
- 使用foreach循环:相比手动维护索引的for循环,foreach更简洁安全,不需要关心数组长度,也不会出现索引越界问题。
- 初始化数组:提前把
$response['url']初始化为空数组,确保后续的元素追加操作正常执行。
更健壮的版本(可选)
如果要考虑源数据可能出现的异常(比如获取失败、JSON格式错误、缺少name字段),可以加上错误处理逻辑,让脚本更稳定:
<?php // 尝试获取远程数据 $uri = file_get_contents('http://lewatmana.com/peta/pois/'); if ($uri === false) { http_response_code(500); echo json_encode(['error' => 'Failed to fetch remote data']); exit; } // 解析JSON并检查错误 $json = json_decode($uri, true); if (json_last_error() !== JSON_ERROR_NONE) { http_response_code(400); echo json_encode(['error' => 'Invalid JSON received from remote source']); exit; } $response['url'] = []; foreach ($json as $item) { // 确保元素存在name字段,避免PHP警告 if (isset($item['name'])) { $response['url'][] = $item['name']; } } echo json_encode($response); ?>
这样修改后,输出的就是一个标准的JSON对象,比如:
{"url":["Alternatif Cibubur", "XXX", "YYY", ...]}
解析器就能正常解码了。
内容的提问来源于stack exchange,提问作者J Daniel
相关产品推荐
相关产品推荐

