使用Dio请求遇类型错误:期望Map<String,dynamic>却获String,求解决
解决Dio请求返回String而非Map导致的类型错误
你遇到的错误核心原因是:response.data是字符串类型,但City.fromJson方法期望接收Map<String, dynamic>类型的参数。这通常是Dio未自动将接口返回的JSON字符串解析为Map对象导致的,常见诱因是接口返回的Content-Type响应头不是application/json,或者Dio默认配置未触发自动解析。
方法1:手动解析JSON字符串
使用dart:convert的jsonDecode工具,将字符串手动转换为Map:
首先导入依赖包:
import 'dart:convert';
修改请求代码:
Future<List<MALL>> get() async { final dio = Dio(); var url = 'My URL'; Response response = await dio.get(url); // 把字符串解析为Map类型 Map<String, dynamic> jsonData = jsonDecode(response.data); City api = City.fromJson(jsonData); return api.malls; }
方法2:强制Dio返回JSON格式
在请求时指定responseType为ResponseType.json,让Dio强制将响应解析为JSON对象,不受接口Content-Type影响:
Future<List<MALL>> get() async { final dio = Dio(); var url = 'My URL'; // 配置响应类型为JSON Response response = await dio.get( url, options: Options(responseType: ResponseType.json) ); City api = City.fromJson(response.data); return api.malls; }
额外优化:提升建模类的安全性
你的MALL类使用late final字段,若接口返回字段缺失或类型不匹配,会触发运行时错误。建议改为带默认值的非空类型,增强鲁棒性:
class MALL { final int id; final String name; final String images; MALL({required this.id, required this.name, required this.images}); factory MALL.fromJson(Map<String, dynamic> data) { // 添加类型检查与默认值,避免空值或类型错误 final id = data['id'] as int? ?? 0; final name = data['name'] as String? ?? ''; final images = data['images'] as String? ?? ''; return MALL(id: id, name: name, images: images); } }
内容的提问来源于stack exchange,提问作者mahsa
相关产品推荐
相关产品推荐

