Dart/Flutter解析JSON时将id-value数组转为Map<int,String>报错如何解决
直接强制转换报错是因为Dart不支持List<Load>到Map<int, String>的直接类型转换,两者底层结构完全不同,需要手动遍历映射实现转换,以下是两种常见场景的实现方案:
场景1:从原始JSON字符串直接转换
先解码JSON,再遍历loads.data数组完成映射:
import 'dart:convert'; void main() { // 你的原始JSON字符串 String jsonStr = ''' { "loads": { "data": [ {"id": 38,"value": "#1038 Fort Dodge, IA - Algona, IA"}, {"id": 39,"value": "#1039 Louisville, KY - Louisville, KY"} ] }, "date_ranges": { "data": [ {"id": "all_time","value": "All"}, {"id": "this_year","value": "This year"} ] } } '''; // 解码JSON Map<String, dynamic> root = jsonDecode(jsonStr); List loadsData = root['loads']['data']; // 转换为目标Map Map<int, String> loadMap = Map.fromIterable( loadsData, key: (item) => item['id'] as int, value: (item) => item['value'] as String, ); // 测试输出 print(loadMap); // 输出:{38: #1038 Fort Dodge, IA - Algona, IA, 39: #1039 Louisville, KY - Louisville, KY} }
如果需要更高的类型安全性,避免空值或类型不匹配导致的崩溃,可以用遍历判断的写法:
Map<int, String> loadMap = {}; for (var item in loadsData) { final id = item['id']; final value = item['value']; if (id is int && value is String) { loadMap[id] = value; } }
场景2:已提前解析为List类
如果你已经把loads.data解析成了Load实体类的列表,可以用Dart集合的for-in语法直接生成Map:
// 假设你的Load类定义如下 class Load { final int id; final String value; Load({required this.id, required this.value}); } // 你已解析得到的Load列表 List<Load> loadList = [...]; // 直接生成目标Map Map<int, String> loadMap = { for (var load in loadList) load.id: load.value, };
内容的提问来源于stack exchange,提问作者Akbar Pulatov
相关产品推荐
相关产品推荐

