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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:33:16