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方法存在错误,导致单个对象解析失败,间接引发列表处理异常。
解决方案
确认API响应结构
先打印完整的API响应体,确认列表所在的键名和层级。比如如果响应是:{ "data": { "results": [ {"id": 1, "name": "Rick"}, {"id": 2, "name": "Morty"} ] } }那你需要先取
jsonResponse['data'],再从中提取results列表,而不是直接取根节点的results。添加空值校验
在调用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(); }检查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
相关产品推荐
相关产品推荐

