Android应用Post传ID到服务器获取数据失败及Gson解析异常排查
问题分析与解决方案
你遇到的JsonSyntaxException核心原因是服务器返回的JSON格式和Retrofit期望的格式不匹配:
- 你的Retrofit接口声明要接收
List<result_düzen>,也就是一组键值对对象的数组(比如[{"id":"10","isim":"berkay",...}]) - 但你的PHP代码返回的是一组纯字符串的数组(比如
["10","selam","berkay",...]),GSON无法把单个字符串转换成你的result_düzen实体类对象,所以抛出了"Expected BEGIN_OBJECT but was STRING"的异常。
具体修复步骤
1. 修复PHP代码(最关键)
把mysqli_fetch_row换成mysqli_fetch_assoc,它会返回关联数组(键是数据库列名,值是对应数据),这样json_encode后会生成符合要求的对象格式JSON。同时还要处理无数据的情况,避免返回null导致客户端解析错误,另外必须修复SQL注入风险:
<?php include ('ayar.php'); $id = $_POST["id"]; // 用预处理语句防止SQL注入,绝对不能直接拼接ID到SQL里! $stmt = mysqli_prepare($connect, "select * from kullanici WHERE id = ?"); mysqli_stmt_bind_param($stmt, "s", $id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $userData = mysqli_fetch_assoc($result); // 返回包含单个对象的数组(如果有数据),否则返回空数组 if ($userData) { echo json_encode([$userData]); } else { echo json_encode([]); } ?>
修改后,当ID存在时,PHP会返回类似这样的JSON:
[{"id":"10","sifre":"1234","isim":"berkay","eposta":"selam",...}]
这完全符合Retrofit和GSON的解析要求。
2. 确认实体类字段与数据库列名匹配
检查你的result_düzen类的字段名(比如isim、eposta)是否和数据库表kullanici的列名完全一致。如果数据库列名是英文(比如name而不是isim),需要给实体类字段添加@SerializedName注解来映射:
public class result_düzen { @SerializedName("name") // 对应数据库列名name private String isim; // ...其他字段同理 }
3. 优化客户端的响应处理
在onResponse里增加空值和请求成功的判断,避免空指针异常,同时取出数据填充到EditText:
@Override public void onResponse(Call<List<result_düzen>> call, Response<List<result_düzen>> response) { if (response.isSuccessful() && response.body() != null) { List<result_düzen> dataList = response.body(); Log.i(TAG, "Düzenle " + dataList.toString()); if (!dataList.isEmpty()) { // 因为是按ID查询,只会有一条数据,取第一个元素 result_düzen user = dataList.get(0); // 填充EditText editTextIsim.setText(user.getIsim()); editTextEposta.setText(user.getEposta()); editTextSifre.setText(user.getSifre()); // ...其他字段依次填充 } else { Log.i(TAG, "未找到对应ID的用户数据"); // 可以给用户提示,比如Toast.makeText(this, "无数据", Toast.LENGTH_SHORT).show(); } } else { Log.i(TAG, "请求失败,状态码:" + response.code()); } }
额外提醒
- 永远不要直接把用户输入的参数拼接进SQL语句,这会导致严重的SQL注入漏洞,必须使用预处理语句(就像上面PHP代码那样)。
- 可以用Postman或者浏览器直接调用你的PHP接口,查看返回的JSON格式是否正确,这是排查这类问题的常用方法。
内容的提问来源于stack exchange,提问作者Hatay Berkay Işıkoğlu
相关产品推荐
相关产品推荐

