You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter JSON转模型报错:MenuBodyData非Map<String,dynamic>子类型

Flutter JSON转模型异常解决方案:type 'MenuBodyData' is not a subtype of type '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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:00:37