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

