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

