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

Flutter中JSON转List报错:NoSuchMethodError: map调用在null上

问题成因分析

出现NoSuchMethodError: The method 'map' was called on null的核心原因是你尝试调用map的对象为null,具体场景包括:

  • API返回的JSON结构和你预期不符,比如你要提取的列表字段(如characters)不存在、拼写错误,或者嵌套层级不对(比如列表在data.results下,但你直接取了根节点的字段)。
  • 解析JSON时未做空值校验,直接对可能为null的变量调用map方法。
  • Model类的fromJson方法存在错误,导致单个对象解析失败,间接引发列表处理异常。
解决方案
  1. 确认API响应结构
    先打印完整的API响应体,确认列表所在的键名和层级。比如如果响应是:

    {
      "data": {
        "results": [
          {"id": 1, "name": "Rick"},
          {"id": 2, "name": "Morty"}
        ]
      }
    }
    

    那你需要先取jsonResponse['data'],再从中提取results列表,而不是直接取根节点的results。

  2. 添加空值校验
    在调用map前先判断列表是否为null且是List类型:

    // 假设jsonResponse是已解码的JSON对象
    final rawList = jsonResponse['results'];
    List<Character> characters = [];
    if (rawList != null && rawList is List) {
      characters = rawList.map((json) => Character.fromJson(json)).toList();
    }
    
  3. 检查Model类的fromJson方法
    确保Character.fromJson方法中每个字段的键名和API返回完全一致,比如API返回character_name,你不能写成name。示例正确的Model类:

    class Character {
      final int id;
      final String name;
    
      Character({required this.id, required this.name});
    
      factory Character.fromJson(Map<String, dynamic> json) {
        return Character(
          id: json['id'] ?? 0, // 添加默认值避免字段为null导致初始化失败
          name: json['name'] ?? 'Unknown',
        );
      }
    }
    
通用解析方法

列表(List)通用解析

封装一个工具方法,自动处理空值和类型校验:

List<T> parseList<T>(dynamic json, T Function(Map<String, dynamic>) fromJson) {
  if (json == null || json is! List) return [];
  return json.map((item) => fromJson(item as Map<String, dynamic>)).toList();
}

// 使用示例
final characters = parseList(jsonResponse['data']['results'], Character.fromJson);

单对象(Map)通用解析

处理单个JSON对象的解析:

T? parseMap<T>(dynamic json, T Function(Map<String, dynamic>) fromJson) {
  if (json == null || json is! Map<String, dynamic>) return null;
  return fromJson(json);
}

// 使用示例
final singleCharacter = parseMap(jsonResponse['data']['character'], Character.fromJson);
额外建议
  • 网络请求时捕获异常,比如请求失败、JSON格式错误,避免返回null的响应体:
    try {
      final response = await http.get(Uri.parse('your_api_url'));
      if (response.statusCode == 200) {
        final jsonResponse = jsonDecode(response.body);
        // 后续解析逻辑
      } else {
        // 处理请求失败
      }
    } catch (e) {
      // 处理网络异常或JSON解析异常
    }
    
  • 可以使用json_serializable包自动生成解析代码,减少手动编写的错误,只需在Model类添加注解,运行命令即可生成fromJson和toJson方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:28:21