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

