Flutter JSON解析报错:List<dynamic>不是Map<String,dynamic>类型的子类型
问题修复方案
错误原因
你后端Spring接口返回的JSON结构是用户数组(外层为[]包裹的列表),json.decode(jsonString)执行后得到的是List<dynamic>类型数据,而你调用的Users.fromJson方法要求入参是Map<String, dynamic>类型,类型不匹配就触发了该报错。
修复步骤
- 调整
getUsers方法的返回值类型,从返回单个Users对象改为返回List<Users>列表 - 直接调用实体类中已经生成好的列表解析方法
usersFromJson完成解析 - 修正变量作用域问题,你原代码中try块内重新定义了局部
userModel变量,导致外层变量始终为null
修复后的代码
Future<List<Users>> getUsers() async{ var client = http.Client(); List<Users> userModel = []; try { var response = await client.get(Uri.parse(Strings.users_url)); if (response.statusCode == 200) { var jsonString = response.body; // 直接调用自带的列表解析方法 userModel = usersFromJson(jsonString); print(userModel); } } catch(e) { print(e); return userModel; } return userModel; }
特殊场景说明
如果你确实只需要获取单个用户对象,可以选择两种方案:
- 调整后端Spring接口,改为返回单个用户对象而非列表
- 解析时取列表的第一个元素:
if (response.statusCode == 200) { var jsonString = response.body; var jsonList = json.decode(jsonString) as List; if(jsonList.isNotEmpty){ userModel = Users.fromJson(jsonList[0]); } }
内容的提问来源于stack exchange,提问作者Stefan Colt
相关产品推荐
相关产品推荐

