Flutter获取API商品数据时报List强转Map<String,dynamic>类型错误
异常原因
类型转换失败的核心原因是JSON解析逻辑和接口实际返回结构不匹配:
- 代码默认
json.decode(responseBody)直接返回商品对象集合,直接对解码结果调用.cast<Map<String, dynamic>>(),要求集合内所有元素都是Map<String, dynamic>类型。 - 该接口实际返回的是混合类型二维数组,结构为
[商品数组, 提示字符串]:- 索引0位置是真正的商品列表,类型为
List<Map<String, dynamic>> - 索引1位置是接口返回的提示文本
"Products Fetched",类型为String
- 索引0位置是真正的商品列表,类型为
- 强转时会尝试把数组内的List、String类型元素都转成Map类型,直接触发类型不匹配异常。
修复方案
调整解析逻辑,先从最外层响应中取出真正的商品数组,再做序列化转换,修复后的parseProducts方法代码如下:
static List<Products> parseProducts(String responseBody) { // 解码整个响应体,最外层为List<dynamic>类型 final outerList = json.decode(responseBody) as List<dynamic>; // 取索引0的元素,即为实际商品列表 final productList = outerList[0] as List<dynamic>; // 遍历商品列表做序列化 return productList .map<Products>((item) => Products.fromJson(item as Map<String, dynamic>)) .toList(); }
额外建议
当前接口把业务数据和提示文本放在同一数组返回的设计非常不规范,后续可协调后端调整为固定结构的Map格式返回,参考结构:
{ "code": 200, "message": "Products Fetched", "data": [/* 商品列表 */] }
统一返回结构可以大幅减少前端JSON解析的层级判断成本,降低类型异常概率。日常开发中做JSON解析前,建议先打印解码后的数据结构确认层级,再做类型转换,避免直接强转引发崩溃。
内容的提问来源于stack exchange,提问作者davers98
相关产品推荐
相关产品推荐

