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

如何降低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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:26:09