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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:15:53