Flutter Dio解析JSON时报List<dynamic>非Map<String,dynamic>?子类型怎么解决
报错原因
该报错的核心是代码期望解析Map<String, dynamic>类型的JSON对象,但接口实际返回的是List<dynamic>数组类型,类型不匹配导致抛出异常。
修复步骤
- 第一步:先打印接口返回的完整数据,确认实际结构
你可以在dio请求完成后先打印返回值,验证是否和你预期的JSON结构一致:
Response res = await dio.get("你的接口地址"); print(res.data.runtimeType); // 打印返回值类型 print(res.data); // 打印完整返回内容
JSON Placeholder的部分公开接口默认返回数组结构(比如/users接口返回所有用户的数组),如果请求地址写错也会触发该问题。
第二步:根据实际返回结构调整解析逻辑
情况1:接口外层确实返回包含目标对象的数组,示例结构如下:[ { "response": {...}, "status": {...}, "data": {...} } ]调整解析代码,先取数组的第一项再传入模型解析:
UserLogin? loginInfo; if(res.data is List && (res.data as List).isNotEmpty){ loginInfo = UserLogin.fromJson(res.data[0]); }情况2:请求地址错误,需要调整为返回单条对象的接口,比如JSON Placeholder请求单条用户数据使用
/users/1而不是/users。第三步:优化模型解析的容错逻辑,避免其他边界情况崩溃
你当前的模型解析没有做空值和类型判断,字段异常时容易崩溃,可按如下调整:
// UserLogin的fromJson调整 factory UserLogin.fromJson(Map<String, dynamic> json) => UserLogin( response: json["response"] is Map ? Response.fromJson(json["response"]) : null, status: json["status"] is Map ? Status.fromJson(json["status"]) : null, data: json["data"] is Map ? Data.fromJson(json["data"]) : null, ); // Response的datetime解析调整,避免时间格式异常崩溃 factory Response.fromJson(Map<String, dynamic> json) => Response( datetime: json["datetime"] is String ? DateTime.tryParse(json["datetime"]) : null, accessToken: json["accessToken"]?.toString(), );
另外注意:dio默认会自动将接口返回的JSON字符串解析为对应类型的Dart对象,你不需要手动调用json.decode转字符串再解析,直接使用res.data即可。
内容的提问来源于stack exchange,提问作者ภาณุเดช ช่างทอง
相关产品推荐
相关产品推荐

