Android Studio中Retrofit无法正确解析JSON响应的orderid值
Retrofit解析PHP返回的JSON时获取orderid崩溃的解决方案
问题核心原因
PHP端使用mysqli_fetch_array()默认返回索引+关联混合数组,导致JSON响应中每个对象包含冗余的键(如"0"和"orderid"),同时Java模型类未做明确的字段映射配置,最终引发解析异常或空指针问题。
修复步骤
1. 修正PHP的JSON输出结构
将mysqli_fetch_array()替换为mysqli_fetch_assoc(),仅返回关联数组,消除冗余索引键:
<?php require 'connection.php'; $mobilenumber = trim($_POST['mobilenumber']); $qry = "select X.orderid from orderlist X where X.mobilenumber='$mobilenumber' and X.ordertime >= CURDATE() order by X.ordertime DESC"; $raw = mysqli_query($con, $qry); $data = []; while ($res = mysqli_fetch_assoc($raw)) { $data[] = $res; } print json_encode($data); mysqli_close($con); ?>
2. 优化Java响应模型类
添加@SerializedName注解明确字段映射,同时将字段设为private(符合Java规范,也确保Gson解析兼容性):
import com.google.gson.annotations.SerializedName; public class response_model_order_status { @SerializedName("orderid") private String orderid; public response_model_order_status() {} public response_model_order_status(String orderid) { this.orderid = orderid; } public String getOrderid() { return orderid; } public void setOrderid(String orderid) { this.orderid = orderid; } }
3. 修复SQL注入风险(重要)
直接拼接用户输入到SQL语句存在注入风险,改用预处理语句:
<?php require 'connection.php'; $mobilenumber = trim($_POST['mobilenumber']); $qry = "select X.orderid from orderlist X where X.mobilenumber=? and X.ordertime >= CURDATE() order by X.ordertime DESC"; $stmt = mysqli_prepare($con, $qry); mysqli_stmt_bind_param($stmt, "s", $mobilenumber); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $data = []; while ($res = mysqli_fetch_assoc($result)) { $data[] = $res; } print json_encode($data); mysqli_close($con); ?>
4. 增加Java代码的空值防护
在解析后添加空值判断,避免空指针异常:
private void fetchingOrderStatusData(String mobilenumber) { Call<List<response_model_order_status>> call = apicontroller .getInstance() .getApi() .getOrderStatus(mobilenumber); call.enqueue(new Callback<List<response_model_order_status>>() { @Override public void onResponse(Call<List<response_model_order_status>> call, Response<List<response_model_order_status>> response) { Log.d("AAAAAAAA", "Service is running..." + mobilenumber + "--1--"); List<response_model_order_status> arrOrderStatus = response.body(); // 空列表判断 if (arrOrderStatus == null || arrOrderStatus.isEmpty()) { Log.d("AAAAAAAA", "No order data found"); return; } Log.d("AAAAAAAA", "Service is running..." + mobilenumber + arrOrderStatus.toString() + "--2--"); for (int i = 0; i < arrOrderStatus.size(); i++) { Log.d("AAAAAAAA", "Service is running..." + mobilenumber + "--3--"); response_model_order_status orderStatus = arrOrderStatus.get(i); if (orderStatus != null) { String orderId = orderStatus.getOrderid(); Log.d("AAAAAAAA", "Service is running..." + (orderId != null ? orderId : "null") + "--4--"); } } } @Override public void onFailure(Call<List<response_model_order_status>> call, Throwable t) { Log.d("AAAAAAAA", "Service failed: " + t.getMessage()); } }); }
内容的提问来源于stack exchange,提问作者Naresh Pradhan
相关产品推荐
相关产品推荐

