Flutter JSON转模型报错:MenuBodyData非Map<String,dynamic>子类型
核心问题本质
这个错误是因为你把已经解析成MenuBodyData对象的实例,再次当作原始JSON的Map<String, dynamic>类型强制转换,而非直接从已实例化的对象中读取数据。
具体修复步骤
1. 检查模型解析的重复操作
如果你已经通过MenuBodyData.fromJson()把JSON转成了对象,就不要再把这个对象重新传入fromJson方法。
- 错误写法:
// 已经是MenuBodyData实例,还强行转成Map再解析,必报错 MenuBodyData errorData = MenuBodyData.fromJson(existingMenuBodyData as Map<String, dynamic>);
- 正确做法:直接从实例中取
children字段
// 假设MenuBodyData类定义了children列表字段 List<ChildModel> targetChildren = existingMenuBodyData.children ?? [];
2. 修正请求处理的数据流转逻辑
如果是在网络请求后解析环节出错,检查是否错误地把已解析的对象当成原始JSON Map处理:
- 错误流程:
final response = await http.get(Uri.parse(apiUrl)); final Map<String, dynamic> responseMap = jsonDecode(response.body); // 先把body解析成MenuBodyData MenuBodyData bodyData = MenuBodyData.fromJson(responseMap['body']); // 错误:把bodyData当成Map去解析children List<ChildModel> children = ChildModel.fromJsonList(bodyData as Map<String, dynamic>);
- 修复后流程:
final response = await http.get(Uri.parse(apiUrl)); final Map<String, dynamic> responseMap = jsonDecode(response.body); MenuBodyData bodyData = MenuBodyData.fromJson(responseMap['body']); // 直接从已解析的bodyData中获取children List<ChildModel> children = bodyData.children ?? [];
3. 确认模型类的字段与解析逻辑匹配
确保MenuBodyData的fromJson方法正确解析children字段,示例代码:
class MenuBodyData { final List<ChildModel>? children; MenuBodyData({this.children}); factory MenuBodyData.fromJson(Map<String, dynamic> json) { return MenuBodyData( children: json['children'] != null ? List<ChildModel>.from(json['children'].map((childJson) => ChildModel.fromJson(childJson))) : null, ); } } class ChildModel { // 根据你的JSON结构定义字段,比如标题、图标等 final String? title; ChildModel({this.title}); factory ChildModel.fromJson(Map<String, dynamic> json) { return ChildModel( title: json['title'], ); } }
4. 校验JSON结构与模型的匹配度
结合你的JSON结构截图,确认:
- 响应中的
body是单个对象(而非数组),该对象下确实存在children数组字段 - 模型类的字段名与JSON字段完全一致(注意大小写、拼写,比如JSON里是
children,模型里不能写成childs)
快速调试技巧
在报错代码前打印变量的运行时类型,明确数据到底是什么类型:
print('当前变量类型:${yourData.runtimeType}');
能快速定位是误把对象当Map处理的问题。
内容的提问来源于stack exchange,提问作者Jarosław Gawlik
相关产品推荐
相关产品推荐

