Flutter中Json转SearchMountainDtoModel列表失败问题排查
问题分析与解决
你遇到的NoSuchMethodError: The method '[]' was called on null错误,核心原因是待解析的JSON结构和解析代码不匹配:
- 实际返回的JSON是一个顶层对象,包含
total和data两个字段,其中data才是存储山地数据的数组 - 但你的解析代码
json.decode(str) as List<dynamic>直接把整个JSON结果当成List处理,类型转换失败后,后续调用map自然会触发空指针错误
修正方案
方案1:创建顶层模型类(推荐,结构更清晰)
新增一个匹配完整JSON结构的顶层模型,同时补充山地模型的id字段避免数据丢失:
import 'dart:convert'; // 顶层响应模型 class MountainSearchResponse { MountainSearchResponse({ required this.total, required this.data, }); int total; List<SearchMountainDtoModel> data; factory MountainSearchResponse.fromJson(Map<String, dynamic> json) => MountainSearchResponse( total: json["total"], data: List<SearchMountainDtoModel>.from(json["data"].map((x) => SearchMountainDtoModel.fromJson(x))), ); Map<String, dynamic> toJson() => { "total": total, "data": List<dynamic>.from(data.map((x) => x.toJson())), }; } // 山地数据模型 class SearchMountainDtoModel { SearchMountainDtoModel({ required this.id, required this.name, }); String id; String name; factory SearchMountainDtoModel.fromJson(Map<String, dynamic> json) => SearchMountainDtoModel( id: json["id"], name: json["name"], ); Map<String, dynamic> toJson() => { "id": id, "name": name, }; } // 解析方法 MountainSearchResponse mountainSearchFromJson(String str) => MountainSearchResponse.fromJson(json.decode(str));
使用示例:
// 假设responseStr是接口返回的JSON字符串 final response = mountainSearchFromJson(responseStr); List<SearchMountainDtoModel> mountains = response.data; int totalCount = response.total;
方案2:直接提取data字段(快速临时修复)
如果不需要total字段,可直接修改原解析方法,先获取顶层对象的data数组:
List<SearchMountainDtoModel> searchMountainFromJson(String str) { final jsonData = json.decode(str) as Map<String, dynamic>; // 增加空值判断,避免data字段不存在时崩溃 final dataList = jsonData["data"] ?? []; return List<SearchMountainDtoModel>.from(dataList.map((e) => SearchMountainDtoModel.fromJson(e))); }
额外优化建议
- 给模型字段添加空值兜底,比如
name: json["name"] ?? "",避免字段缺失时出现空字符串错误 - 始终保留接口返回的关键字段(比如
id),避免后续业务逻辑出现数据断层
内容的提问来源于stack exchange,提问作者user19717894
相关产品推荐
相关产品推荐

