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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:24:52