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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:55:24