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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:57:02