Flutter 如何将JSON编码结果还原为List<Map<String, String>>类型
类型转换报错的核心原因
json.decode()的返回值是dynamic类型,解码生成的集合有固定的默认运行时类型:外层数组结构对应List<dynamic>,内层键值对结构对应Map<String, dynamic>- 你代码里直接把内层Map强转为
Map<String, String>的操作会触发类型转换异常:哪怕Map里存的所有值实际都是String,由于运行时Map的泛型参数是dynamic而非String,单次整体强转无法通过Dart的运行时类型检查 - 链式调用存在冗余操作:
json.decode()遇到JSON数组时返回的本身就是List<dynamic>实例,额外调用的.toList()属于无意义的重复拷贝,多余的空判?.还会干扰IDE的类型推导,放大类型不匹配的问题
正确实现代码
// 1. 先将解码结果的外层结构断言为 List<dynamic> final decodedData = json.decode(myVar) as List<dynamic>; // 2. 逐元素遍历,对每个内层Map做类型收束,生成目标类型 List<Map<String, String>> restoredExpense = decodedData.map((item) { // 单元素先断言为 json 解码生成的原生 Map 类型 final rawMap = item as Map<String, dynamic>; // 遍历Map的所有键值对,统一将值收束为String类型,匹配目标泛型要求 return rawMap.map((key, value) => MapEntry(key, value.toString())); }).toList();
实现说明
- 这套写法和你最初的变量结构完全兼容:因为你原始变量里的所有Map值本身就是String类型,经过JSON编码、解码的完整流程后值的类型不会发生变化,最终还原出的
restoredExpense和初始的expense变量结构完全一致 - 不要尝试直接对JSON解码结果做整体泛型强转(比如写
json.decode(myVar) as List<Map<String, String>>),这种写法在Dart运行时一定会抛出类型错误,因为json库生成的对象泛型和目标类型的运行时泛型不匹配
内容的提问来源于stack exchange,提问作者Eular
相关产品推荐
相关产品推荐

