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

解码JSON遇类型错误:期望List<dynamic>却得到_JsonMap

解决JSON解码类型不匹配问题

错误原因很明确:你期望后端返回一个数组(List),但实际返回的是一个JSON对象(Map),直接把Map赋值给List类型的paymentList就会触发类型错误。

解决步骤

1. 先确认后端返回的JSON结构

在response.statusCode == 200的分支里先打印返回内容,明确实际格式:

print(response.body);

常见的两种返回格式:

  • 情况A:返回包含数组的对象,格式类似:{"payments": [{"id": "1"}, {"id": "2"}]}
  • 情况B:返回单个对象,格式类似:{"id": "1", "amount": 100}

2. 根据实际结构修改代码

针对情况A(返回带数组的对象)

提取对象中的数组字段赋值给paymentList,替换'payments'为接口实际返回的数组键名:

setState(() {
  final jsonResponse = jsonDecode(response.body);
  paymentList = jsonResponse['payments'];
});

针对情况B(返回单个对象)

把单个对象包装成List再赋值:

setState(() {
  final jsonResponse = jsonDecode(response.body);
  paymentList = [jsonResponse];
});

3. 进阶:用强类型提升代码安全性

建议定义Payment实体类,避免动态类型的潜在问题:

class Payment {
  final String id;
  final double amount;
  // 根据接口返回的字段添加对应属性

  Payment({required this.id, required this.amount});

  // 从JSON对象转为Payment实例
  factory Payment.fromJson(Map<String, dynamic> json) {
    return Payment(
      id: json['id'],
      amount: json['amount'].toDouble(),
    );
  }
}

然后修改解码逻辑:

  • 情况A:
setState(() {
  final jsonResponse = jsonDecode(response.body);
  paymentList = (jsonResponse['payments'] as List)
      .map((item) => Payment.fromJson(item))
      .toList();
});
  • 情况B:
setState(() {
  final jsonResponse = jsonDecode(response.body);
  paymentList = [Payment.fromJson(jsonResponse)];
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:01:18