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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:32:06