Dart解码JSON并做类型转换时持续报错,该如何排查解决?
问题原因
- 根JSON结构为对象而非数组:
json.decode(jsonResponse.body)返回的是Map<String, dynamic>类型的根对象,不是列表,直接调用cast<Map<String, dynamic>>并做遍历映射属于类型不匹配,是报错的核心原因。 - 取值路径错误:需要解析的菜单数据存储在根对象的
data字段下的menus数组中,原代码未定位到目标数组就直接操作根对象。 - 类型声明不匹配:变量声明为
List<Profile>类型,但映射逻辑返回MyMenu实例,类型不一致会触发强类型校验报错。 - 额外注意:提供的原始JSON存在多余尾逗号(如
sec_user下的officeid字段后、menus数组最后一个元素后均有无效逗号),部分严格JSON解析器会直接抛出解析异常,建议先清理无效逗号。
修复方案
直接取值转换
如果你只需要获取菜单列表,可以直接定位到menus数组做转换:
if (jsonResponse.statusCode == 200) { // 解码得到根对象 final Map<String, dynamic> rootJson = json.decode(jsonResponse.body); // 定位到menus数组 final List<dynamic> menuRawList = rootJson['data']['menus']; // 转换为MyMenu类型列表,若需要返回Profile类型请调整对应序列化逻辑 List<MyMenu> menuList = menuRawList.map((item) => MyMenu.fromJson(item)).toList(); return menuList; }
嵌套序列化方案(更规范)
如果你的模型是全量嵌套设计,可以定义根响应模型配合json_annotation做全量序列化:
- 定义根响应模型:
import 'package:json_annotation/json_annotation.dart'; part 'base_response.g.dart'; @JsonSerializable() class BaseResponse { final int status_code; final String message; final Profile data; BaseResponse(this.status_code, this.message, this.data); factory BaseResponse.fromJson(Map<String, dynamic> json) => _$BaseResponseFromJson(json); }
- 解码逻辑调整为:
if (jsonResponse.statusCode == 200) { final Map<String, dynamic> rootJson = json.decode(jsonResponse.body); final BaseResponse response = BaseResponse.fromJson(rootJson); // response.data即为完整的Profile对象,内置menus等所有字段 return response.data; }
内容的提问来源于stack exchange,提问作者user3931627
相关产品推荐
相关产品推荐

