如何在Flutter中处理带嵌套结构的特殊JSON POST请求
问题原因
你当前的代码仅直接序列化了LoginProfile类本身的属性,没有按照后端要求在外层包裹Registration节点,同时现有类逻辑也遗漏了VerifyCode字段的序列化处理。
修正步骤
1. 补全LoginProfile类的字段逻辑
首先给构造方法、序列化、反序列化方法都补全VerifyCode的处理:
// 修正后的LoginProfile类 class LoginProfile { int id; String CardNumber; String ExpiryDate; String ExpiryYear; String VerifyCode; // 确认该字段可正常获取到TextField的输入值 LoginProfile({ this.id = 0, required this.CardNumber, required this.ExpiryDate, required this.ExpiryYear, required this.VerifyCode, // 新增VerifyCode必填参数 }); factory LoginProfile.fromJson(Map<String, dynamic> map) { return LoginProfile( id: map["id"], CardNumber: map["CardNumber"], ExpiryDate: map["ExpiryDate"], ExpiryYear: map["ExpiryYear"], VerifyCode: map["VerifyCode"], // 反序列化补全VerifyCode ); } Map<String, dynamic> toJson() { return { "id": id, "CardNumber": CardNumber, "ExpiryDate": ExpiryDate, "ExpiryYear": ExpiryYear, "VerifyCode": VerifyCode, // 序列化补全VerifyCode }; } @override String toString() { return 'Profile{id: $id, CardNumber: $CardNumber, ExpiryDate: $ExpiryDate, ExpiryYear: $ExpiryYear, VerifyCode: $VerifyCode}'; } }
2. 修改请求体构造逻辑
发送请求时不要直接序列化LoginProfile对象,在外层套一层Registration节点再序列化即可,注意要导入dart:convert库做JSON序列化:
import 'dart:convert'; Future<bool> createProfile(LoginProfile data) async { // 构造符合要求的外层结构 final requestBody = { "Registration": data.toJson(), }; final response = await client.post( Uri.parse("$baseUrl"), // 新版本http/dio库要求传Uri类型,旧版本可直接传字符串地址 headers: {'Content-Type': 'application/json; charset=UTF-8'}, body: jsonEncode(requestBody), // 序列化外层结构作为请求体 ); if (response.statusCode == 201) { return true; } else { print(response.body); return false; // 补充缺失的返回值,避免语法报错 } }
补充说明
如果后端不需要接收id字段,直接在toJson方法中删除"id": id这一行即可,序列化后的结构就会完全匹配你需要的目标格式。
内容的提问来源于stack exchange,提问作者mideveloper
相关产品推荐
相关产品推荐

