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
相关产品推荐
相关产品推荐

