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
相关产品推荐
相关产品推荐

