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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:27:00