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

Flutter解析分组JSON报错:_InternalLinkedHashMap非List子类型

问题根因

你遇到的Dart Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>'是典型的JSON解析类型不匹配错误,触发点就在你提到的nasabah_service.dart第17行getNasabah方法里:
你做分组封装后,接口返回的顶层JSON结构从之前的纯数组,变成了键值对结构(也就是Dart里的_InternalLinkedHashMap),但你代码里还是直接把整个JSON解析结果强转成List<dynamic>,类型对不上直接抛错。

未封装前接口直接返回Mstdebitur对象数组,所以直接转List可以正常加载;做响应封装后,一般接口会在外层包一层公共字段(比如状态码、提示信息、实际数据字段),实际的列表数据存在外层Map的某个key对应的value里,你直接转List必然报错。

修复步骤
  • 先定位真实列表字段:在getNasabah方法请求成功的回调里,加一行调试代码final resp = jsonDecode(response.body); print(resp.runtimeType); print(resp);,运行后看控制台输出,确认顶层Map里哪个key对应你要的nasabah列表,通常这个key命名为data/list/result。
  • 修正解析逻辑,把第17行的错误强转替换成如下逻辑:
// 删掉你原来直接转List的代码,替换成下面的
// 1. 先把解析结果转成顶层Map
final Map<String, dynamic> respMap = jsonDecode(response.body) as Map<String, dynamic>;
// 2. 从Map里取出实际的列表数组,记得把'data'换成你上一步调试看到的真实key名
final List<dynamic> nasabahJsonList = respMap['data'] as List<dynamic>;
// 3. 后续再遍历nasabahJsonList,把每一项转成Mstdebitur实体对象即可
  • 检查响应封装类的字段定义:确认你写的响应结果类里,存列表的字段类型是List<Mstdebitur>,不要误写成Map类型;如果是你自己在代码里做前端分组(不是接口返回分组结构),检查分组逻辑是不是不小心把列表包成了Map,导致后续取数时类型错误。
  • 修复后执行热重启(不要用热重载,Dart的类型缓存会导致旧错误残留),重新触发页面加载即可。

新手避坑提示:做Flutter JSON解析时不要直接强转目标类型,每一步解析后都可以打印runtimeType确认实际结构,能避开绝大多数类型转换错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:33:16