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
相关产品推荐
相关产品推荐

