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

