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

Flutter/Dart中JSON字符串转Map<String,dynamic>报类型不匹配错误如何解决?

错误原因
  • 多余的序列化操作:传入函数的参数s本身就是接口返回的标准JSON字符串,你调用jsonEncode(s)会将字符串再次序列化,生成带转义符的新字符串。后续jsonDecode处理这个新字符串得到的结果是String类型,而非预期的Map<String, dynamic>,强转时直接触发类型不匹配异常。
  • 类型适配不到位:extractedData['timeline']是数组类型,直接调用map后得到的是Iterable对象,未显式转为List也可能引发后续类型错误。
修复方案

直接删除多余的jsonEncode步骤,调整类型转换逻辑即可,修复后的函数代码如下:

static List<String> getVacDates(String s) {
  // 直接解码原始JSON字符串
  final extractedData = jsonDecode(s) as Map<String, dynamic>;
  // 遍历timeline数组提取date字段,显式指定类型并转为List
  return extractedData['timeline']
      .map<String>((item) => item['date'] as String)
      .toList();
}

如果需要兼容空值、字段缺失等异常场景,可以使用更安全的写法:

static List<String> getVacDates(String s) {
  final decodeResult = jsonDecode(s);
  // 校验解码结果类型
  if (decodeResult is! Map<String, dynamic>) return [];
  final timeline = decodeResult['timeline'];
  // 校验timeline字段类型
  if (timeline is! List) return [];
  // 遍历过滤异常值
  return timeline
      .map<String>((item) {
        if (item is Map<String, dynamic> && item['date'] is String) {
          return item['date'] as String;
        }
        return '';
      })
      .where((dateStr) => dateStr.isNotEmpty)
      .toList();
}

你后续在myFunction中用集合for循环实现的版本逻辑本身是正确的,只要没有多余的jsonEncode操作即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:15:02