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
相关产品推荐
相关产品推荐

