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
相关产品推荐
相关产品推荐

