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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:35:18