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

Flutter中如何将数组转为JSON对象通过HTTP POST请求提交?

解决测验应用JSON提交问题

首先你的代码存在一个关键问题:submit函数的answer参数类型定义为List<String>,但你实际传入的是包含键值对的对象列表(比如[{question_id: 2, option_id: 14}]),类型不匹配会导致JSON编码失败。按以下步骤修正:

1. 修正参数类型

将函数参数的List<String> answer改为List<Map<String, dynamic>> answer,匹配实际传入的数据结构:

submit(testId, List<Map<String, dynamic>> answer) async {
  // ... 后续代码
}

2. 添加JSON请求头

在请求头中明确指定Content-Type为application/json,确保后端能正确解析JSON格式的请求体:

headers: {
  "Authorization": "Bearer $token",
  "Content-Type": "application/json" // 新增这一行
},

3. 确保JSON编码正确

你的请求体结构本身是正确的,修正参数类型后,json.encode可以直接序列化这个包含列表的Map:

body: json.encode({
  'test_id': testId,
  'questions': answer, // 建议把键名从'question'改成'questions',更符合复数列表的语义,若后端要求'question'则保持原样
}),

完整修正后的代码

submit(testId, List<Map<String, dynamic>> answer) async {
  try {
    Response response = await post(
      Uri.parse(NetworkConstants.BASE_URL + 'get-participate-to-test/${widget.id}'),
      headers: {
        "Authorization": "Bearer $token",
        "Content-Type": "application/json"
      },
      body: json.encode({
        'test_id': testId,
        'questions': answer,
      }),
    );
    if (response.statusCode == 200) {
      var data = jsonDecode(response.body.toString());
      print(data);
      showToast(context, data['message']);
      // Navigator.of(context).pushAndRemoveUntil(
      //     MaterialPageRoute(builder: (context) => HomeScreen()),
      //         (Route<dynamic> route) => false);
    } else {
      var data = jsonDecode(response.body.toString());
      print(data);
      showToast(context, data['message']);
    }
  } catch (e) {
    setState(() {
      print(e);
    });
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text("Exception:"),
          content: Text(e.toString()),
          actions: [
            TextButton(
              child: Text("Try Again"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            )
          ],
        );
      },
    );
  }
}

关键说明

  • 参数类型必须和实际传入的数据匹配:List<Map<String, dynamic>>对应你传入的对象列表,这样json.encode才能正确将其序列化为JSON数组。
  • Content-Type头是必要的:大部分后端框架需要这个头来识别请求体的格式,否则可能会解析失败。

内容的提问来源于stack exchange,提问作者Md. Mustafizur Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:39:18