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

Dart转换JSON响应为模型代码时出现两个类型不匹配错误

错误原因

两个报错均为Dart强类型+空安全模式下,未对JSON解析出的dynamic类型值做显式转换,直接赋值给强类型变量/传入强类型参数导致:

  • A value of type 'dynamic' can't be assigned to a variable of type 'List<String>?:json['options']默认返回dynamic类型,直接调用cast<String>()时编译器无法确认该值为List集合,类型校验不通过
  • The argument type 'dynamic' can't be assigned to the parameter type 'Map<String, dynamic>':遍历json['params']时,迭代出的元素v默认是dynamic类型,直接传入要求入参为Map<String, dynamic>的Params.fromJson构造方法,类型校验不通过
修复代码

直接替换原有模型类代码即可,修复了类型转换问题,同时增加了空值容错,避免接口返回null时崩溃:

class GetImProfileDetails {
  List<Params>? params;
  String? status;
  String? statusDesc;

  GetImProfileDetails({this.params, this.status, this.statusDesc});

  GetImProfileDetails.fromJson(Map<String, dynamic> json) {
    if (json['params'] != null) {
      params = <Params>[];
      // 显式转List后遍历,迭代元素显式转Map类型
      (json['params'] as List).forEach((v) {
        params!.add(Params.fromJson(v as Map<String, dynamic>));
      });
    }
    // 改为可空类型接收,避免字段返回null时强转报错
    status = json['status'] as String?;
    statusDesc = json['statusDesc'] as String?;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    if (params != null) {
      data['params'] = params!.map((v) => v.toJson()).toList();
    }
    data['status'] = status;
    data['statusDesc'] = statusDesc;
    return data;
  }
}

class Params {
  String? head;
  String? headCode;
  List<String>? options;

  Params({this.head, this.headCode, this.options});

  Params.fromJson(Map<String, dynamic> json) {
    head = json['head'] as String?;
    headCode = json['headCode'] as String?;
    if (json['options'] != null) {
      // 显式转List后再cast为String列表,解决第一个类型错误
      options = (json['options'] as List).cast<String>();
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['head'] = head;
    data['headCode'] = headCode;
    data['options'] = options;
    return data;
  }
}
解析注意事项
  • 不要对接口返回字段做非空强转(比如直接as String),接口字段存在空值返回可能,强转非空会直接抛出运行时异常
  • 所有嵌套的对象、列表类型JSON字段,解析时必须显式声明对应类型,不要依赖dynamic的隐式类型推断,强类型模式下编译器不会自动识别dynamic值的实际结构

内容的提问来源于stack exchange,提问作者BC TUBE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:09:16