Flutter解析考勤API JSON时出现类型不匹配异常求助
排查修复DIO解析JSON时的类型不匹配异常
核心问题定位
这个异常的本质是:你在模型类的字段声明中,把API返回的JSON嵌套对象(对应Dart中的_InternalLinkedHashMap<String, dynamic>)错误定义成了String类型,解析时序列化工具试图将对象强制转为字符串,触发类型不匹配。
具体排查修复步骤
1. 核对API返回结构与模型字段类型
先打印API返回的原始JSON(执行print(response.data)),逐一对比字段类型:
- 例如API返回的嵌套结构:
若你的{ "result": { "attendance_id": "ATD-202405", "breaks": { "start": "2024-05-20 12:00", "end": "2024-05-20 12:30" } } }Result模型类中把breaks声明为String,就会触发异常,应改为BreaksSet类型。
2. 检查模型类的序列化代码
如果使用json_serializable生成解析逻辑,确保:
- 嵌套对象字段正确关联对应模型类,而非
String - 没有手动错误转换类型(比如写
breaks: json['breaks'].toString())
示例正确的模型结构:
import 'package:json_annotation/json_annotation.dart'; part 'attendance_models.g.dart'; @JsonSerializable() class Attendance { final Result result; Attendance({required this.result}); factory Attendance.fromJson(Map<String, dynamic> json) => _$AttendanceFromJson(json); } @JsonSerializable() class Result { final String attendance_id; final BreaksSet breaks; // 此处为BreaksSet类型,而非String Result({required this.attendance_id, required this.breaks}); factory Result.fromJson(Map<String, dynamic> json) => _$ResultFromJson(json); } @JsonSerializable() class BreaksSet { final String start; final String end; BreaksSet({required this.start, required this.end}); factory BreaksSet.fromJson(Map<String, dynamic> json) => _$BreaksSetFromJson(json); }
3. 修正DIO解析逻辑
- 手动解析时,不要将嵌套对象转为字符串:
错误写法:Result(attendance_id: json['attendance_id'], breaks: json['breaks'] as String)
正确写法:Result(attendance_id: json['attendance_id'], breaks: BreaksSet.fromJson(json['breaks'])) - 使用DIO自带转换时,确保泛型与模型匹配:
Response<Attendance> response = await dio.get<Attendance>( '/api/attendance', options: Options(responseType: ResponseType.json), );
4. 排查字段名映射错误
若API返回字段名与模型字段名不一致(比如API返回break_info,模型写breaks),且未添加@JsonKey(name: 'break_info')注解,会导致字段解析为null,可能触发隐性类型异常,需同步修正。
快速验证方案
暂时将模型中所有可疑的嵌套字段改为dynamic类型,解析后打印字段类型,定位到实际为_InternalLinkedHashMap但被声明为String的字段,再修正为对应模型类即可。
内容的提问来源于stack exchange,提问作者Syed Mahamudul Hasan
相关产品推荐
相关产品推荐

