Flutter使用HTTP POST发送嵌套数组到API出现映射错误如何解决?
存在的问题
- 类重名冲突:你定义了两个都叫
Assessment的类,Dart无法区分两个类的用途,会直接导致编译或运行时类型映射错误。 - 类成员与构造逻辑不匹配:第一个
Assessment类中仅声明了subId成员,但是fromJson中给不存在的subCategoryId赋值,toJson中还引用了未声明的assessmentId、subCategoryId变量,运行时会直接抛未定义属性的异常。 - 构造方法名称与类名不匹配:第一个类的工厂构造写的是
AssessmentQuestionList.fromJson,和当前类名Assessment完全不符,同时你在解析嵌套的assessment列表时调用的Assessment.fromJson根本没有定义,会直接抛出方法未找到的错误。第二个类也存在同样的问题,工厂构造名称是AssessmentAnswerList.fromJson,和类名Assessment不匹配。 - 缺少空安全处理:如果
assessment列表、isChecked等字段可能为空,直接调用.map、直接赋值会抛出空指针或类型不匹配异常。 - 序列化逻辑缺陷:由于前面的类定义错误,
jsonEncode调用时无法正确序列化QuestionList中的模型对象,最终传给接口的字段结构不符合预期。
解决方案
1. 修正模型类代码
// 评估问题模型类 class AssessmentQuestion { AssessmentQuestion({ this.id, this.subId, this.question, this.assessment, // 如果接口需要assessmentId、subCategoryId字段,可在此处添加对应成员 }); String? id; String? subId; String? question; // 嵌套的答案列表关联答案模型类 List<AssessmentAnswer>? assessment; factory AssessmentQuestion.fromJson(Map<String, dynamic> json) => AssessmentQuestion( id: json["id"], subId: json["subId"], question: json["question"], assessment: json["assessment"] == null ? null : List<AssessmentAnswer>.from( json["assessment"].map((x) => AssessmentAnswer.fromJson(x))), ); Map<String, dynamic> toJson() => { "id": id, "subId": subId, // 如需传输assessmentId、subCategoryId可在此处添加键值对,和接口要求对齐即可 "question": question, "assessment": assessment == null ? null : List<dynamic>.from(assessment!.map((x) => x.toJson())), }; } // 评估答案模型类 class AssessmentAnswer { AssessmentAnswer({ this.id, this.assessmentQuestionId, this.option, this.isChecked, }); String? id; String? assessmentQuestionId; dynamic option; bool? isChecked; factory AssessmentAnswer.fromJson(Map<String, dynamic> json) => AssessmentAnswer( id: json["id"], assessmentQuestionId: json["assessmentQuestionId"], option: json["option"], // 兼容接口返回数字/字符串类型的布尔值 isChecked: json["isChecked"] is bool ? json["isChecked"] : json["isChecked"] == 1 || json["isChecked"].toString().toLowerCase() == 'true', ); Map<String, dynamic> toJson() => { "id": id, "assessmentQuestionId": assessmentQuestionId, "option": option, // 布尔值转成接口接受的类型,可根据接口要求调整为true/false "isChecked": isChecked == true ? 1 : 0, }; }
2. 优化请求方法
Future<http.Response> saveassess(String authToken, String id, String assessmentId, // 明确指定列表类型,避免隐式类型转换错误 List<AssessmentQuestion> questionList, String childUserId, String notes) async { String uriparts = apiEndPoint.getUriParts('assess/Assess'); Uri url = apiEndPoint.getHTTPUri(uriparts); // 序列化前打印校验结构是否符合接口要求 final requestBody = <String, dynamic>{ "id": id, "assessmentId": assessmentId, "assessmentQuestionAnswerList": questionList, "childUserId": childUserId, "notes": notes, }; print("请求参数:${jsonEncode(requestBody)}"); final response = await http.post( url, headers: <String, String>{ 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': authToken }, body: jsonEncode(requestBody), ); print("接口返回:${response.body}"); handleAssesmentsResponse(response); return response; }
额外校验建议
确保toJson方法中的所有字段名、字段类型和接口要求完全一致,包括大小写、嵌套层级,如果仍有报错,可对比打印的请求体和接口错误提示,即可快速定位字段不匹配问题。
内容的提问来源于stack exchange,提问作者palak
相关产品推荐
相关产品推荐

