Flutter处理分组JSON响应该用List<dynamic>还是Map<String, dynamic>?
问题原因
- 首先你的API返回的JSON根结构是键值对对象,不是数组,所以必须用
Map<String, dynamic>类型接收返回值,你之前用List类型接收自然会抛出「List is not a subtype of type Map<String, dynamic>」的类型错误。 - 你代码里的
result1 = [] as Map;属于错误的强制类型转换,空数组无法转为Map类型,该行代码可以直接删除。
正确提取数据的实现方式
基础动态解析实现(无需模型类,适合快速开发)
首先把你接收返回值的result1变量声明修改为Map<String, dynamic>?类型,然后修改请求代码如下:
void getTerm1Result() async { final response = await http.post( Uri.parse(TERM1 + sid + '&sess=' + sess + '&term=' + term), headers: {"Content-Type": "application/json"}, ); if (response.statusCode == 200) { print("reached"); setState(() { // 直接把解码后的结果转成Map<String, dynamic>类型 Map<String, dynamic> responseData = jsonDecode(response.body) as Map<String, dynamic>; result1 = responseData; resultLoading = false; // 提取四个分组数据示例 // 1. 提取result数组里的第一个科目的subject List resultList = responseData['result'] as List; print(resultList[0]['subject']); // 输出 AGRICULTURE SCIENCE // 2. 提取others分组的班主任评语 Map othersData = responseData['others'] as Map; print(othersData['tcomment']); // 输出 He is a gentle boy // 3. 提取affective分组数据 Map affectiveData = responseData['affective'] as Map; print(affectiveData['col1']); // 4. 提取psychomotor分组数据 Map psychomotorData = responseData['psychomotor'] as Map; print(psychomotorData['col4']); }); } else { print("Not reached"); } }
更规范的方案(模型类序列化,适合生产环境)
如果要避免动态类型的安全隐患,可以针对JSON结构编写对应Dart模型类,使用json_serializable库做序列化/反序列化,编译期就能校验类型错误,运行时不会出现类型转换异常。
内容的提问来源于stack exchange,提问作者Datapalace
相关产品推荐
相关产品推荐

