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

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做全量序列化:

  1. 定义根响应模型:
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);
}
  1. 解码逻辑调整为:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:09:01