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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:55:20