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

