Dart类型转换错误:无法将List<dynamic>转为List<Map<String, Object>>
解决Dart中JSON解码后List转List<Map<String, Object>>的类型错误
问题核心在于json.decode返回的是dynamic类型,直接强制转换为List<Map<String, Object>>会触发类型不匹配——Dart不允许直接将嵌套的动态泛型集合强转为具体类型的嵌套集合。
修正方案:手动遍历转换元素
先将解码结果转为List<dynamic>,再逐个把内部元素转为Map<String, Object>:
List<Map<String, Object>> list = []; list.add({'time': dateStr, 'name': 'summa', 'points': number.toString()}); String? encodedList = json.encode(list); await prefs.setString('Values', encodedList); final String? encodedList2 = prefs.getString('Values'); // 先转成List<dynamic>,再遍历转换每个元素 List<dynamic> tempList = json.decode(encodedList2!) as List<dynamic>; List<Map<String, Object>> decodedList = tempList.map((item) { return item as Map<String, Object>; }).toList();
原理说明
json.decode解析JSON数组时,返回的是List<dynamic>,其中每个元素是Map<String, dynamic>类型。- Dart的泛型强转仅支持顶层类型转换(比如
List<dynamic>转List),嵌套的泛型转换(直接转List<Map<String, Object>>)会被判定为不安全操作,编译器会直接拒绝。 - 通过
map遍历每个元素,将单个dynamic元素强转为Map<String, Object>后再转为List,就能得到目标类型的集合。
简化写法(使用cast)
如果能确认所有元素都符合Map<String, Object>结构,也可以用cast快速转换:
List<Map<String, Object>> decodedList = (json.decode(encodedList2!) as List<dynamic>).cast<Map<String, Object>>();
注意:若JSON中存在不符合Map<String, Object>的元素,这种写法会在运行时抛出错误,仅适用于数据结构确定的场景。
内容的提问来源于stack exchange,提问作者Mano Haran
相关产品推荐
相关产品推荐

