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

Flutter使用JsonSerializable反序列化Map<int,List<int>>报类型转换错误

错误原因

  • 核心问题是fromJson方法中对someMap的value类型转换逻辑错误:JSON反序列化后取出的value默认是List<dynamic>类型,Dart不支持直接将List<dynamic>强转为List<int>,你当前写法里的e as List<int>会触发类型不匹配异常。
  • 额外需要注意:你代码中泛型参数加了引号(Map<"String", "dynamic">)属于语法错误,泛型参数不需要加引号。如果之前测试Map<int, int>类型时存过旧数据到SharedPreferences,旧数据的value是int类型也会触发本次报错,转换前先清空本地缓存排除干扰。

修复方案

调整someMap的转换逻辑,先将value转为List<dynamic>再调用cast<int>方法转为目标类型,同时给所有可空字段增加判空处理,避免空值调用方法抛异常。修改后完整代码如下:

// Dart类名规范使用大驼峰命名
class Calculation {
  List<int>? calcs;
  List<int>? results;
  List<int>? selectedSpots;
  List<double>? linedataX;
  List<double>? linedataY;
  Map<int, List<int>>? someMap;

  Calculation({
    this.calcs,
    this.results,
    this.selectedSpots,
    this.linedataX,
    this.linedataY,
    this.someMap,
  });

  factory Calculation.fromJson(Map<String, dynamic> jsonData) {
    return Calculation(
      // 可空字段先判空再转换,避免空指针
      calcs: jsonData['calcs']?.cast<int>(),
      results: jsonData['results']?.cast<int>(),
      selectedSpots: jsonData['selectedSpots']?.cast<int>(),
      linedataX: jsonData['linedataX']?.cast<double>(),
      linedataY: jsonData['linedataY']?.cast<double>(),
      someMap: (jsonData['someMap'] as Map?)?.map(
            (k, e) => MapEntry(
              int.parse(k as String),
              // 先转成通用List再cast为目标类型
              (e as List).cast<int>(),
            ),
      ),
    );
  }

  static Map<String, dynamic> toMap(Calculation calc) => {
        'calcs': calc.calcs,
        'results': calc.results,
        'selectedSpots': calc.selectedSpots,
        'linedataX': calc.linedataX,
        'linedataY': calc.linedataY,
        'someMap': calc.someMap?.map((k, e) => MapEntry(k.toString(), e)),
  }; 
}

补充建议

如果你确实是使用json_serializable包,更推荐用注解自动生成序列化代码,不需要手动编写类型转换逻辑,自动生成的代码会自动处理嵌套列表、Map的类型适配,能大幅降低手写出错的概率。

内容的提问来源于stack exchange,提问作者devkirch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:36:03