Android中Retrofit从PHP/MySQL获取Boolean字段报错求助
解决Retrofit解析MySQL TINYINT为Java boolean的报错问题
你遇到的问题核心是:MySQL的TINYINT类型在PHP中被解析为数字(0/1),而Gson期望JSON对应字段是布尔值(true/false),导致解析报错。由于无法修改Java模型字段类型,以下几种优雅的解决方案可以从SQL或PHP层面处理:
方案1:修改SQL查询,直接转换字段逻辑
不需要遍历结果集,直接在SQL中明确处理selected字段,让PHP识别为布尔值:
SELECT clistId, deviceName, ord, categOrd, -- 将0/1转换为布尔逻辑,PHP会自动识别为bool类型 CASE WHEN selected = 1 THEN TRUE ELSE FALSE END AS selected -- 按需补充其他字段 FROM `ComList` WHERE deviceName = '$deviceName' ORDER BY clistId, ord, categOrd ASC;
注意:这里要避免使用SELECT *,需明确列出所有字段并单独处理selected,这样查询结果中的selected会被PHP解析为布尔值,json_encode时自动输出true/false。
方案2:用PHP数组映射优雅转换字段
如果不想修改SQL,可以用array_map替代手动遍历,代码更简洁:
$response = $bdd->query($sql); $output = array_map(function($item) { // 将数字0/1强制转换为布尔值 $item['selected'] = (bool)$item['selected']; return $item; }, $response->fetchAll(PDO::FETCH_ASSOC)); echo(json_encode($output, JSON_PRETTY_PRINT));
这种函数式写法比foreach循环更简洁,也符合PHP的现代编程风格。
方案3:PDO逐行转换(适合大结果集)
如果处理的是大数量级的结果集,逐行转换能降低内存占用:
$stmt = $bdd->query($sql); $output = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $row['selected'] = (bool)$row['selected']; $output[] = $row; } echo(json_encode($output, JSON_PRETTY_PRINT));
以上方案都能让PHP输出的JSON中selected字段为标准布尔值,完美适配Java模型中的boolean类型,彻底解决Gson解析报错问题。
内容的提问来源于stack exchange,提问作者Chris972
相关产品推荐
相关产品推荐

