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

Flutter-Dart解析JSON数组报错:List<dynamic>无法转为List<BusinessTest>

问题修复与JSON解析建议

一、修复type 'List<dynamic>' is not a subtype of type 'List<BusinessTest>'错误

错误核心原因:json['businesses']返回的是List<dynamic>类型,Dart无法自动将其转换为List<BusinessTest>,必须手动遍历列表,把每个动态元素转为BusinessTest对象。

修改后的BusinessSearch类代码:

class BusinessSearch {
  final List<BusinessTest> businesses;
  // 注意:你的JSON示例中没有`total`字段,若API实际不返回该值,需将total设为可空或直接移除
  final int? total;

  BusinessSearch(this.businesses, this.total);

  BusinessSearch.fromJson(Map<String, dynamic> json)
      : businesses = (json['businesses'] as List)
            .map((item) => BusinessTest.fromJson(item as Map<String, dynamic>))
            .toList(),
        total = json['total'];
}

额外提醒:你的JSON示例里没有total字段,但原BusinessSearch类定义了该成员。如果API确实不会返回total,要么将total改为可空类型(如上述代码),要么直接删除这个字段,避免解析时触发额外错误。

二、解析JSON是否应该始终使用可空类型?

不是必须,需根据实际场景判断:

  • 若API文档明确字段为必填项:可以不用可空类型,但要做好异常兜底。比如API承诺name字段永远存在,可将BusinessTest里的name设为final String name;,但解析时如果字段缺失会抛出错误,需在逻辑中捕获处理,或给字段设置默认值。
  • 若字段可能缺失、或返回null:必须使用可空类型,或给字段设置合理默认值。比如可选扩展字段、部分场景下不返回的字段,用String?这类可空类型能避免解析失败。

举个设置默认值的示例:

BusinessTest.fromJson(Map<String, dynamic> json)
    : name = json['name'] ?? '未知名称',
      imageUrl = json['image_url'] ?? '',
      isClosed = json['is_closed'] ?? false,
      url = json['url'] ?? '',
      reviewCount = json['review_count'] ?? 0;

这种方式既规避了可空类型,又处理了字段缺失的情况,适合有合理默认值的字段。

最后,你的解析代码中jsonDecode(data)不需要加await(jsonDecode是同步方法),修正后:

void getData() async {
  try {
    String url = 'url';
    NetworkHelp network = NetworkHelp(url: url);
    var data = await network.getData();
    Map<String, dynamic> businessMap = jsonDecode(data);
    var business = BusinessSearch.fromJson(businessMap);
  } catch (e) {
    print(e);
  }
}

内容的提问来源于stack exchange,提问作者6pounder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:45:42