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

Kotlin使用Retrofit获取PHP返回数组失败及后端代码修复求助

修复方案

核心问题说明

  • 后端返回的questions字段为对象结构,和Kotlin侧定义的List<Question>数组类型不匹配
  • 原有PHP数据组装逻辑错误,未将同一份问卷的多个问题合并到同一数组中
  • 额外注意:接口返回的id为字符串类型,Kotlin侧定义为Int,建议统一类型避免解析异常

修正后的PHP代码

$sql = "SELECT questionnaires.id QuestionnaireId, questionnaires.title QuestionnaireTitle, questions.id QuestionId, questions.text Question 
FROM questionnaires INNER JOIN questionnaireshasquestions qa ON qa.idQuestionnaire = questionnaires.id 
INNER JOIN questions ON questions.id = qa.idQuestion";
$conn = $dbh->prepare($sql);
$conn->execute();
// 按问卷ID分组获取结果,PDO::FETCH_GROUP会自动把第一列作为分组键
$result = $conn->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);

$test = [
    'status' => true,
    'message' => 'Succefully got questionnaires!!!',
    'questionnaires' => []
];

foreach ($result as $questionnaireId => $items) {
    // 同一份问卷的基础信息取第一条即可
    $firstItem = $items[0];
    $questions = [];
    // 遍历当前问卷下的所有问题,组装成数组
    foreach ($items as $item) {
        $questions[] = [
            'id' => (int)$item['QuestionId'], // 转成int匹配Kotlin侧类型
            'text' => $item['Question']
        ];
    }
    // 组装问卷数据
    $test['questionnaires'][] = [
        'id' => (int)$questionnaireId, // 转成int匹配Kotlin侧类型
        'title' => $firstItem['QuestionnaireTitle'],
        'questions' => $questions // 这里是数组结构,匹配Kotlin侧List要求
    ];
}

// 返回JSON
echo json_encode($test);

关键修改点说明

  • 移除了原有冗余的while循环和$endResult变量,直接使用PDO::FETCH_GROUP的分组结果进行组装
  • 对每一份问卷遍历所有关联的问题,组装成数组格式赋值给questions字段
  • 把所有id字段强制转为int类型,和Kotlin侧的Int类型定义对齐,避免额外解析错误
  • 直接在组装逻辑里补全了status和message字段,避免遗漏返回参数

可选端侧兼容方案(不修改后端的情况)

如果不方便修改后端代码,可以在Kotlin侧自定义Gson反序列化适配器,将单个Question对象自动转换为单元素List<Question>,适配接口返回结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:04