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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:37:11