如何在Dart中从JSON文件正确创建包含Map的实例?
解决JSON反序列化中
Map<String, dynamic>转Map<String, int>的问题 问题原因
jsonDecode解析JSON后返回的数值类型默认是dynamic(实际为num类型,可能是int或double),而你的Race类中abilitiesUpdater定义为Map<String, int>,直接赋值会触发类型不匹配错误,必须显式将dynamic类型的值转换为int。
解决方案
修改Race类的fromJson方法,对abilitiesUpdater做显式类型转换:
方法1:遍历Map逐个转换值(安全可靠)
class Race { final String name; final Map<String, int> abilitiesUpdater; const Race({ required this.name, required this.abilitiesUpdater }); static Race fromJson(Map<String, dynamic> json) { // 取出原始的dynamic类型Map final rawAbilities = json['abilitiesUpdater'] as Map<String, dynamic>; // 遍历并将每个值转为int final convertedAbilities = rawAbilities.map( (key, value) => MapEntry(key, value as int), ); return Race( name: json['name'] as String, abilitiesUpdater: convertedAbilities, ); } }
方法2:使用cast快速转换(需确保JSON值均为int)
如果能保证JSON中abilitiesUpdater的所有值都是整数,也可以用cast简化代码,但如果存在非int值会直接报错:
class Race { final String name; final Map<String, int> abilitiesUpdater; const Race({ required this.name, required this.abilitiesUpdater }); static Race fromJson(Map<String, dynamic> json) { return Race( name: json['name'] as String, abilitiesUpdater: (json['abilitiesUpdater'] as Map<String, dynamic>).cast<String, int>(), ); } }
额外优化建议
- 给
fromJson的参数指定Map<String, dynamic>类型,避免隐式dynamic,提升代码安全性。 - 可以添加空值兜底逻辑(比如
json['name'] ?? '未知种族'),防止JSON字段缺失导致崩溃。
你的RacesApi代码无需修改,转换逻辑已封装在Race.fromJson中。
内容的提问来源于stack exchange,提问作者n3wbie
相关产品推荐
相关产品推荐

