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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 03:45:06