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

Flutter中如何统计JSON嵌套列表内的条目总数

Flutter统计嵌套JSON中所有data子列表的条目总数

我有如下JSON结构,其中data数组包含两个items对象,每个items内部又有data子列表。需要统计所有data子列表的条目总数,预期结果为3(第一个items的data有2条,第二个有1条)。但我尝试的循环代码无法实现需求,求正确的实现方式。

目标JSON结构

{ 
 "data": [ 
    {
      "items": { 
                 "data": [ 
                     { 
                         "id": 874, 
                         "user_id": 5, 
                         "session_id": null, 
                         "merchant_id": 7922, 
                         "inventory_id": 701, 
                         "product_id": 49405, 
                         "batch_number": "767819153", 
                         "quantity": 2, 
                         "unit_price": 1399, 
                         "total_price": 2798, 
                         "status_id": 4, 
                         "created_at": "2023-02-14T07:02:40.000000Z", 
                         "updated_at": "2023-02-14T09:52:27.000000Z", 
                         "deleted_at": null, 
                         "taxes": [], 
                         "tax_amount": 0, 
                         "discounts": null, 
                         "discount_amount": 0, 
                         "is_out_of_stock": false, 
                         "is_expired": false 
                     }, 
                     { 
                         "id": 874, 
                         "user_id": 5, 
                         "session_id": null, 
                         "merchant_id": 7922, 
                         "inventory_id": 701, 
                         "product_id": 49405, 
                         "batch_number": "767819153", 
                         "quantity": 2, 
                         "unit_price": 1399, 
                         "total_price": 2798, 
                         "status_id": 4, 
                         "created_at": "2023-02-14T07:02:40.000000Z", 
                         "updated_at": "2023-02-14T09:52:27.000000Z", 
                         "deleted_at": null, 
                         "taxes": [], 
                         "tax_amount": 0, 
                         "discounts": null, 
                         "discount_amount": 0, 
                         "is_out_of_stock": false, 
                         "is_expired": false 
                     } 
                 ], 
                 "sub_total": 2798, 
                 "total_tax": 0, 
                 "total_discount": 0, 
                 "total_cost": 2798 
             }
    }, 
    {
      "items": { 
                 "data": [ 
                     { 
                         "id": 874, 
                         "user_id": 5, 
                         "session_id": null, 
                         "merchant_id": 7922, 
                         "inventory_id": 701, 
                         "product_id": 49405, 
                         "batch_number": "767819153", 
                         "quantity": 2, 
                         "unit_price": 1399, 
                         "total_price": 2798, 
                         "status_id": 4, 
                         "created_at": "2023-02-14T07:02:40.000000Z", 
                         "updated_at": "2023-02-14T09:52:27.000000Z", 
                         "deleted_at": null, 
                         "taxes": [], 
                         "tax_amount": 0, 
                         "discounts": null, 
                         "discount_amount": 0, 
                         "is_out_of_stock": false, 
                         "is_expired": false 
                     } 
                 ], 
                 "sub_total": 2798, 
                 "total_tax": 0, 
                 "total_discount": 0, 
                 "total_cost": 2798 
             }
    } 
 ] 
} 

尝试过的无效代码

for (var data in responseData['data']) { 
  return data['items']['data']; 
} 

问题分析

这段代码在循环第一次迭代时就直接return,只会返回第一个items的data列表,既没有遍历所有元素,也没有统计条目数量,所以无法得到总计数。

正确实现方式

方式一:循环累加计数

通过遍历data数组的每个元素,逐个取出items里的data列表,累加其长度:

int totalCount = 0;
// 遍历responseData中的data数组
for (var item in responseData['data']) {
  // 获取当前items下的data列表,并累加长度
  List dataList = item['items']['data'];
  totalCount += dataList.length;
}
print(totalCount); // 输出预期结果3

方式二:使用fold方法简洁实现

利用Dart集合的fold方法,一行代码完成累加:

int totalCount = (responseData['data'] as List).fold(0, (sum, item) {
  return sum + (item['items']['data'] as List).length;
});
print(totalCount); // 输出预期结果3

健壮性优化(处理空值情况)

如果JSON中可能存在items为空或data不是列表的情况,可以添加空值判断避免报错:

int totalCount = 0;
for (var item in responseData['data']) {
  if (item['items'] != null && item['items']['data'] is List) {
    totalCount += (item['items']['data'] as List).length;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:35:14