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

Android读取嵌套JSON数组存Model时避免重复条目的方法

问题根源分析

你遇到的productDetails重复条目问题,核心原因是**productsList没有在每个订单的解析周期内重置**。从代码来看,这个列表应该是在循环外部声明的(比如类成员变量),所以每处理一个新订单时,都会把当前订单的产品追加到同一个列表里——第二个订单的产品列表会包含第一个订单的产品,第三个会包含前两个的,以此类推,最终出现重复。

修复方案

只需要把productsList的初始化移到外层的订单循环(也就是for (int i = 0; i < orderDetails.length(); i++)这个循环)内部,每次处理新订单时,创建一个全新的空列表来存放当前订单的产品即可。

另外,代码里的ordersList.add(addressModel);如果不是业务必需的,建议可以去掉,避免不必要的内存占用。

修改后的完整代码
final JSONObject output = response.getJSONObject("data");
if (output.getString("success").equalsIgnoreCase("true")) {
    final JSONArray orderDetails = output.getJSONArray("orders");
    // 清空订单列表,避免多次请求时重复累加(如果orders是成员变量的话)
    orders.clear();
    
    for (int i = 0; i < orderDetails.length(); i++) {
        // 关键改动:每个订单创建独立的productsList,彻底避免复用旧数据
        List<ProductDetailsModel> productsList = new ArrayList<>();
        
        // 获取单个订单对象
        JSONObject orderData = orderDetails.getJSONObject(i);
        
        // 解析当前订单的产品详情
        JSONArray products = orderData.getJSONArray("productDetails");
        for (int k = 0; k < products.length(); k++) {
            JSONObject productData = products.getJSONObject(k);
            JSONObject optionData = productData.getJSONObject("optionDetails");
            
            ProductDetailsModel product = new ProductDetailsModel(
                productData.getString("productId"),
                productData.getString("storeId"),
                productData.getString("productName"),
                productData.getString("quantity"),
                productData.getString("productAmount"),
                productData.getString("totalAmount"),
                optionData.getString("optionId"),
                optionData.getString("optionName"),
                optionData.getString("optionAmount")
            );
            productsList.add(product);
            
            // 调试用:直接打印当前产品,比遍历整个列表更清晰
            // System.out.println("当前产品数量: "+product.getQuantity());
        }
        
        // 解析用户地址信息
        JSONObject userAddress = orderData.getJSONObject("userAddressDetails");
        UserAddressDetailsModel addressModel = new UserAddressDetailsModel(
            userAddress.getString("firstName"),
            userAddress.getString("middleName"),
            userAddress.getString("lastName"),
            userAddress.getString("email"),
            userAddress.getString("mobileNo"),
            userAddress.getString("address"),
            userAddress.getString("landMark"),
            userAddress.getString("city"),
            userAddress.getString("zipCode"),
            userAddress.getString("stateName"),
            userAddress.getString("countryName"),
            userAddress.getString("latitude"),
            userAddress.getString("longitude")
        );
        
        // 如果ordersList不是业务必需,建议删除此行
        // ordersList.add(addressModel);
        
        // 组装当前订单并加入列表
        Order order = new Order(
            orderData.getString("tax"),
            orderData.getString("shippingCharges"),
            orderData.getString("amount"),
            orderData.getString("subTotal"),
            orderData.getString("discount"),
            orderData.getString("prefix"),
            orderData.getString("createdOn"),
            orderData.getString("couponCode"),
            orderData.getString("orderId"),
            orderData.getString("deliveryCode"),
            orderData.getString("shopId"),
            orderData.getString("createdBy"),
            orderData.getString("status"),
            productsList,
            addressModel
        );
        orders.add(order);
    }
    adapter.notifyDataSetChanged();
} else {
    Toast.makeText(getActivity(), output.getString("message"), Toast.LENGTH_LONG).show();
}
关键改动说明
  • 把productsList的创建移到了每个订单的循环内部,确保每个订单都有独立的产品列表,完全隔离不同订单的产品数据。
  • 增加了orders.clear(),防止多次请求接口时,订单列表重复累加旧数据。
  • 调整了调试输出的逻辑,直接打印当前添加的产品,比遍历整个列表更高效清晰。

内容的提问来源于stack exchange,提问作者Omkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:39