Flutter网络请求报错:_Map类型无法转换为String类型
问题定位与解决
错误核心
这个异常直接说明:你在代码里把一个嵌套Map类型(_Map<String, List<Map<String, Map<String, String>>>>)当成了String类型处理,本质是JSON解析环节的类型完全不匹配,问题大概率出在两个关键节点:网络请求后的JSON转换逻辑,或者Model类的字段/解析方法定义。
具体排查与修复步骤
1. 修正网络请求的JSON转换逻辑
确保你先把响应体的字符串转成Map,再传给Model的解析方法,不要搞反类型:
import 'dart:convert'; import 'package:http/http.dart' as http; // 正确的请求与转换流程 final response = await http.get(Uri.parse('你的接口地址')); if (response.statusCode == 200) { // 必须先把response.body(String)转成Map final Map<String, dynamic> jsonMap = jsonDecode(response.body); // 用Map生成Model实例 final targetModel = TargetModel.fromJson(jsonMap); }
- 错误示例:如果直接把
jsonMap(Map类型)传给需要String参数的方法,或者反过来把response.body直接丢给要求Map的fromJson方法,都会触发这个类型异常。
2. 检查Model类的字段与解析方法
根据接口返回的JSON结构,确保Model的字段类型完全匹配,不能把嵌套的Map/数组当成String:
假设你的接口返回JSON结构如下:
{ "result": [ { "detail": { "name": "xxx", "id": "123" } } ] }
对应的Model类必须定义嵌套结构,而不是把嵌套对象赋值给String字段:
// 正确的嵌套Model示例 class TargetModel { final List<ResultItem>? result; TargetModel({this.result}); factory TargetModel.fromJson(Map<String, dynamic> json) { return TargetModel( result: json['result'] != null ? List<ResultItem>.from(json['result'].map((item) => ResultItem.fromJson(item))) : null, ); } } class ResultItem { final Detail? detail; ResultItem({this.detail}); factory ResultItem.fromJson(Map<String, dynamic> json) { return ResultItem( detail: json['detail'] != null ? Detail.fromJson(json['detail']) : null, ); } } class Detail { final String? name; final String? id; Detail({this.name, this.id}); factory Detail.fromJson(Map<String, dynamic> json) { return Detail( name: json['name'], id: json['id'], ); } }
- 错误示例:如果把
TargetModel里的result字段定义成String? result,解析时就会把List
3. 验证在线工具生成的Model类
在线JSON转Dart工具可能因JSON层级较深生成错误的类型,你需要手动核对:
- 确认每个字段的类型和JSON对应值的类型一致:JSON里是数组,Model里必须是
List<子Model>;JSON里是嵌套对象,Model里必须是对应子Model类型,绝对不能是String。
快速调试技巧
在解析前打印各层级数据的类型,快速定位不匹配的节点:
final jsonMap = jsonDecode(response.body); print('根节点类型: ${jsonMap.runtimeType}'); print('result字段类型: ${jsonMap["result"].runtimeType}');
根据打印结果调整Model类的字段类型,确保完全对应。
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

