Flutter中API响应JSON解码及List数据获取问题
解决JSON解码转模型类的类型错误问题
1. 先确认API响应的JSON结构
先搞清楚你拿到的API返回JSON结构和模型类是否对应,比如典型的响应格式可能是这样:
{ "result": [ { "summary": { "id": 1, "content": "示例内容" }, // QuoteSummary的其他字段 } ] }
如果QuoteSummary对应数组里的每个对象,得先从解码后的JSON里精准取出result对应的数组。
2. 检查模型类的fromJson方法
确保你的QuoteSummary类有正确的fromJson构造函数,参数必须是Map<String, dynamic>,不能用dynamic,示例:
class QuoteSummary { final Summary summary; // 其他字段 QuoteSummary({required this.summary, /* 其他必填参数 */}); factory QuoteSummary.fromJson(Map<String, dynamic> json) { return QuoteSummary( summary: Summary.fromJson(json['summary']), // 其他字段按JSON结构解析 ); } }
3. 正确解码并转换列表
别直接对dynamic结果用map,先做明确的类型转换,步骤如下:
// 假设response是API返回的响应体 final decodedJson = jsonDecode(response.body) as Map<String, dynamic>; // 取出result数组并转成List<dynamic> final resultList = decodedJson['result'] as List<dynamic>; // 逐个转换为QuoteSummary对象,注意强制转Map<String, dynamic> final quoteSummaries = resultList.map((json) => QuoteSummary.fromJson(json as Map<String, dynamic>)).toList();
关键细节:
- 必须把解码后的JSON转成
Map<String, dynamic>,明确类型 - map的时候要把每个json元素强转成
Map<String, dynamic>,保证fromJson拿到正确类型的参数
4. 用于ListView的示例
转换完成后直接用在ListView里就行:
ListView.builder( itemCount: quoteSummaries.length, itemBuilder: (context, index) { final item = quoteSummaries[index]; return ListTile( title: Text(item.summary.content), // 其他UI展示逻辑 ); }, )
常见踩坑点
- 别省略类型转换:比如
json as Map<String, dynamic>,跳过的话Dart类型推断容易出错 - 核对JSON字段名和模型类的一致性,包括大小写(比如JSON里是
summary,模型里不能写成Summary) - 如果API返回的
result可能为null,要加非空兜底:
final resultList = decodedJson['result'] as List<dynamic>? ?? [];
内容的提问来源于stack exchange,提问作者Carsten Cerny
相关产品推荐
相关产品推荐

