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

Flutter遍历嵌套JSON数据时类型不匹配报错的解决方法

报错根因

你当前代码触发类型不匹配错误的核心原因有两个:

  1. jsonResponse[0][0]['name']取到的是NGO名称的字符串值,直接把这个字符串赋值给List<dynamic>类型的allNamesOfNGO变量,自然会抛出「String类型无法赋值给List」的异常。
  2. 遍历的起始节点完全选错了:你要遍历多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 16:36:04