Flutter API调用中ExamData模型status字段解析异常问题
问题描述
我的代码能正常获取API返回的考试列表,但通过ExamData模型存储该列表时,处理包含成绩、日期、荣誉等属性的status对象字段会出现异常。移除该字段后考试数据可正常加载,但保留则会报错。我尝试修改ExamData的fromJson方法,将status设为可空值,但仍会触发fetchAllExamStudent函数中的“Errore Caricamento Esami”(考试加载错误)异常。
控制器代码
Future<List<ExamData>> fetchAllExamStudent(User student, BuildContext context) async { try { // 等待API响应完成 final List<ExamData> responseData = await apiService.getStudentExams(student, context); print('Lunghezza lista${responseData.length}'); if (responseData.isNotEmpty) { print('\n\nPrimo elemento della lista:'); print(responseData.first); } else { print('\n\nLa lista è vuota.'); } return responseData; } catch (e) { throw Exception('Errore Caricamento Esami'); } }
API服务代码
Future<List<ExamData>> getStudentExams(User student, BuildContext context) async { const String matId = "000000"; // 测试用的matId final url = Uri.parse('$baseUrl/v2/students/myExams/$matId'); final response = await http.get(url, headers: { 'Authorization': 'Basic ${base64Encode(utf8.encode("${student.username}:${student.password}"))}', }); print(response.statusCode); if (response.statusCode == 200) { final jsonData = jsonDecode(response.body) as List<dynamic>; print('\nallExam:\n $jsonData'); return jsonData.map((data) => ExamData.fromJson(data)).toList(); } else if (response.statusCode == 500) { throw Exception('Errore del SERVER durante il caricamento degli esami dello studente'); } else { throw Exception('\nErrore durante caricamento esami dello studente'); } }
原Exam模型代码
class ExamData { String? nome; String? codice; String? tipo; int? adId; int? adsceID; String? docente; String? docenteID; String? semestre; String? semestreDes; String? adLogId; String? domPartCod; Status status; ExamData({ required this.nome, required this.codice, required this.tipo, required this.adId, required this.adsceID, required this.docente, required this.docenteID, required this.semestre, required this.semestreDes, required this.adLogId, required this.domPartCod, required this.status, }); factory ExamData.fromJson(Map<String, dynamic> json) { try { return ExamData( nome: json['nome'] as String?, codice: json['codice'] as String?, tipo: json['tipo'] as String?, adId: json['adId'] as int?, adsceID: json['adsceID'] as int?, docente: json['docente'] as String?, docenteID: json['docenteID'] as String?, semestre: json['semestre'] as String?, semestreDes: json['semestreDes'] as String?, adLogId: json['adLogId'] as String?, domPartCod: json['domPartCod'] as String?, status: Status.fromJson(json['status']), ); } catch (e) { throw FormatException('Errore durante il parsing del JSON: $e'); } } } class Status { String? esito; int? voto; int? lode; String? data; Status({ required this.esito, required this.voto, required this.lode, required this.data }); factory Status.fromJson(Map<String, dynamic> json) { try { return Status( esito: json['esito'] as String?, voto: json['voto'] as int?, lode: json['lode'] as int?, data: json['data'] as String? ); } catch (e) { throw FormatException('Errore durante il parsing del JSON STATUS: $e'); } } }
修改后的fromJson方法
factory ExamData.fromJson(Map<String, dynamic> json) { try { return ExamData( nome: json['nome'] as String?, codice: json['codice'] as String?, tipo: json['tipo'] as String?, adId: json['adId'] as int?, adsceID: json['adsceID'] as int?, docente: json['docente'] as String?, docenteID: json['docenteID'] as String?, semestre: json['semestre'] as String?, semestreDes: json['semestreDes'] as String?, adLogId: json['adLogId'] as String?, domPartCod: json['domPartCod'] as String?, status: json['status'] != null ? Status.fromJson(json['status']) : null, cfu: json['CFU'] as int?, annoId: json['annoId'] as int?, numAppelliPrenotabili: json['numAppelliPrenotabili'] as int?, tipoInsDes: json['tipoInsDes'] as String?, tipoInsCod: json['tipoInsCod'] as String?, tipoEsaDes: json['tipoEsaDes'] as String?, ); } catch (e) { throw FormatException('Errore durante il parsing del JSON: $e'); } }
内容的提问来源于stack exchange,提问作者Carmine Coppola
相关产品推荐
相关产品推荐

