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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:09:00