如何修复Dart报错:期望Map<String,dynamic>但得到List<dynamic>
报错根因
接口返回的最外层结构是JSON数组(对应Dart的List<dynamic>类型),但现有代码在解析时强行将解码后的结果强转为Map<String, dynamic>(单JSON对象对应的类型),类型完全不匹配导致报错。
另外你已经提前实现了列表解析方法welcomeFromJson,但API调用层完全没使用该方法,反而错误调用了单对象解析方法ProjectJson.fromJson处理整个返回数组,逻辑本身存在错误。同时你的请求URL里的{customer_id}是未替换的占位符,属于隐藏bug,会导致请求路径不正确。
修复方案
1. 修正API调用层代码
重点调整三个点:
- 替换URL中的
{customer_id}占位符为传入的实际CustomerID参数 - 删除错误的类型强转、单对象解析逻辑,直接调用已实现的
welcomeFromJson方法解析返回字符串 - 补全方法的返回值逻辑,匹配方法声明的返回类型
修正后的完整API代码如下:
Future<List<ProjectJson>?> OpenProjectCall( String CustomerID, String APIKey) async { var headers = {'customer_id': CustomerID, 'APIKey': APIKey}; var request = http.Request( 'GET', Uri.parse( 'http://65.254.144.50:5114/Customers/$CustomerID/OpenProjects')); request.headers.addAll(headers); final response = await request.send(); final String respStr = await response.stream.bytesToString(); if (response.statusCode == 200) { List<ProjectJson> _project = welcomeFromJson(respStr); print(_project); return _project; } else { print(response.reasonPhrase); return null; } }
2. 优化模型类的解析兜底(可选但建议加)
原有promisedDate字段解析时没有做空判断和格式容错,接口返回null或者日期格式非法时会直接抛错,建议修改ProjectJson.fromJson中对应字段的解析逻辑:
// 原有代码 // promisedDate: DateTime.parse(json["promised_Date"]), // 修改为 promisedDate: json["promised_Date"] == null ? null : DateTime.tryParse(json["promised_Date"]),
之前修改Map泛型无效的原因
无论把Map的泛型参数改成Map<,dynamic>还是Map<dynamic, dynamic>,本质都是尝试将数组类型的返回值强转为键值对Map类型,根上的类型不匹配问题没有解决,自然无法修复报错。
内容的提问来源于stack exchange,提问作者Aiden P
相关产品推荐
相关产品推荐

