Flutter遍历嵌套JSON数据时类型不匹配报错的解决方法
报错根因
你当前代码触发类型不匹配错误的核心原因有两个:
jsonResponse[0][0]['name']取到的是NGO名称的字符串值,直接把这个字符串赋值给List<dynamic>类型的allNamesOfNGO变量,自然会抛出「String类型无法赋值给List」的异常。 - 遍历的起始节点完全选错了:你要遍历多个NGO实体,应该从承载所有NGO数据的数组节点开始循环,而不是从单个NGO的name字段值开始。
修正后的可运行遍历逻辑
先梳理清楚这份JSON的嵌套层级,确保遍历节点和数据类型完全对应:
- 最外层是数组,唯一的元素仍然是一个数组,这个内层数组才是存放所有NGO实体的列表
- 每个NGO实体是键值对结构,包含基础信息字段和
reg_details嵌套数组 reg_details数组的每个元素也是键值对结构,存放注册相关的详细信息
对应修正后的遍历代码如下:
String jsonString = await _loadANgoAsset(); // 显式声明最外层结构为List,避免隐式类型转换带来的问题 final List<dynamic> jsonResponse = json.decode(jsonString) as List<dynamic>; // 定位到存放所有NGO实体的内层数组 final List<dynamic> ngoList = jsonResponse[0] as List<dynamic>; // 遍历每个NGO实体 ngoList.forEach((ngoRawData) { final Map<String, dynamic> ngo = ngoRawData as Map<String, dynamic>; // 打印NGO基础信息 print("NGO编号:${ngo['nos']}"); print("NGO名称:${ngo['name']}"); print("NGO备案ID:${ngo['unique_id']}"); // 遍历嵌套的注册详情数组 final List<dynamic> regDetails = ngo['reg_details'] as List<dynamic>; regDetails.forEach((regRawItem) { final Map<String, dynamic> regItem = regRawItem as Map<String, dynamic>; // 遍历每个注册信息的键值对 regItem.forEach((key, value) { print("注册信息[$key]:$value"); }); }); });
日常避坑提示
- 赋值前先确认取到的值的实际类型:不要想当然把字段值当成列表结构,尤其是JSON多层嵌套的场景,提前对节点做类型校验,能避免90%的运行时类型转换异常。
- 遍历逻辑要严格匹配数据结构层级:遇到数组就用数组循环,遇到键值对就用Map的forEach遍历,不要跨层跳转取数,否则很容易出现类型不匹配的问题。
- 实际项目中更推荐把JSON结构转成对应的实体类,从根源上避免动态类型带来的运行时错误。
内容的提问来源于stack exchange,提问作者Bill_The_Coder
相关产品推荐
相关产品推荐

