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

如何正确解析PHP返回的对象数组以解决Ajax JSON解析错误?

解决Ajax请求JSON解析错误的问题

我来帮你排查这个JSON解析错误的问题,看了你的代码和返回的JSON结果,主要有几个关键点需要修正:

1. 修复PHP数组初始化的多余空元素

你初始化$roleList的时候用了$roleList[] = "";,导致返回的JSON开头多了一个空字符串元素""——虽然这个JSON本身语法是有效的,但这是不必要的冗余,而且可能在前端循环时引发潜在问题。把数组初始化改成空数组即可:

// 原来的错误写法
// $roleList[] = "";

// 正确的初始化方式
$roleList = [];

2. 添加JSON响应头(关键!)

你的PHP脚本没有设置响应内容类型为JSON,这是导致jQuery触发parsererror的核心原因之一。服务器默认会把响应标记为text/html,而jQuery的dataType: 'JSON'要求响应必须是正确的JSON MIME类型。在输出JSON之前添加以下代码:

header('Content-Type: application/json');

3. 确保PHP脚本没有多余输出

检查你的get_all_roles.php以及任何被引入的文件,确保没有多余的空格、换行、echo或var_dump输出——这些内容会附加在JSON前面,导致返回的内容不是纯JSON,直接触发解析错误。

修改后的完整getAllRoles()实现

function getAllRoles() {
    $roleList = []; // 初始化空数组
    try {
        $SQL = "CALL getAllRoles()";
        $sp_getAllRoles = $this->connection->prepare($SQL);
        $sp_getAllRoles->execute();
        $resultSet = $sp_getAllRoles->fetchAll(PDO::FETCH_ASSOC);
        
        foreach ($resultSet as $row) {
            $roleId = $row['role_id'];
            $roleName = $row['role_name'];
            $roleList[] = array("roleId" => $roleId, "roleName" => $roleName);
        }
        
        header('Content-Type: application/json'); // 设置JSON响应头
        echo json_encode($roleList);
    } catch (PDOException $e) {
        // 异常时也返回JSON格式的错误信息,避免前端解析失败
        header('Content-Type: application/json');
        echo json_encode(['error' => $e->getMessage()]);
        exit;
    }
}

前端代码优化(可选)

你的JS代码本身没问题,不过可以用jQuery的$.each方法让循环更简洁:

function loadRolesToDropDown() { 
    var url = 'controller/get_all_roles.php'; 
    $.ajax({ 
        url: url, 
        type: 'GET', 
        dataType: 'JSON', 
        success: function (data) { 
            $("#roledropdown").empty();
            // 用$.each遍历数组更直观
            $.each(data, function(index, role) {
                $("#roledropdown").append(`<option value="${role.roleId}">${role.roleName}</option>`);
            });
        }, 
        error: function (x, e) { 
            if (x.status == 0) { 
                alert('You are offline!!\n Please Check Your Network.'); 
            } else if (x.status == 404) { 
                alert('Requested URL not found.'); 
            } else if (x.status == 500) { 
                alert('Internal Server Error.'); 
            } else if (e == 'parsererror') { 
                alert('Error.\nParsing JSON Request failed.'); 
            } else if (e == 'timeout') { 
                alert('Request Time out.'); 
            } else { 
                alert('Unknown Error.\n' + x.responseText); 
            } 
        } 
    }); 
}

测试验证

修改完成后,直接在浏览器访问controller/get_all_roles.php,检查返回的内容是不是纯JSON(比如[{"roleId":1,"roleName":"Administrator"},...]),没有任何多余的空格或文本。如果返回的是纯JSON,那前端的解析错误应该就解决了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:38:20