如何在Dart中解析包含不同对象列表的JSON?
在Dart中映射Dio返回的异构数组JSON结构
针对你这种包含两个异构对象的数组JSON,我们可以通过定义对应的数据模型类,再针对性解析数组中的元素来处理,具体步骤如下:
1. 定义对应的数据模型类
首先根据JSON结构,分别定义球员、队伍的模型类,以及包含它们列表的外层响应类:
// 球员模型,根据实际JSON字段补充属性 class Player { final String id; final String name; // 其他字段例如 position, jerseyNumber 等 Player({required this.id, required this.name}); factory Player.fromJson(Map<String, dynamic> json) { return Player( id: json['id'] ?? '', // 处理可能的null值 name: json['name'] ?? '', // 其他字段对应赋值 ); } } // 包装球员列表的响应类 class PlayersFilterResult { final List<Player> players; PlayersFilterResult({required this.players}); factory PlayersFilterResult.fromJson(Map<String, dynamic> json) { final playersList = json['Players'] as List? ?? []; return PlayersFilterResult( players: playersList.map((p) => Player.fromJson(p)).toList(), ); } } // 队伍模型,根据实际JSON字段补充属性 class Team { final String id; final String teamName; // 其他字段例如 coach, logoUrl 等 Team({required this.id, required this.teamName}); factory Team.fromJson(Map<String, dynamic> json) { return Team( id: json['id'] ?? '', teamName: json['teamName'] ?? '', // 其他字段对应赋值 ); } } // 包装队伍列表的响应类 class TeamsFilterResult { final List<Team> teams; TeamsFilterResult({required this.teams}); factory TeamsFilterResult.fromJson(Map<String, dynamic> json) { final teamsList = json['Teams'] as List? ?? []; return TeamsFilterResult( teams: teamsList.map((t) => Team.fromJson(t)).toList(), ); } }
2. 解析Dio返回的响应数据
Dio返回的response.data是一个List,我们可以直接按索引取出两个元素分别解析,或者遍历数组根据key判断类型(更灵活):
方式一:按索引直接解析(适用于确定数组元素顺序的情况)
// 假设已通过Dio获取到response final responseData = response.data as List<dynamic>; // 解析球员数据 final playersJson = responseData[0]['getPlayersFilterResult']; final playersResult = PlayersFilterResult.fromJson(playersJson); final List<Player> players = playersResult.players; // 解析队伍数据 final teamsJson = responseData[1]['getTeamsFilterResult']; final teamsResult = TeamsFilterResult.fromJson(teamsJson); final List<Team> teams = teamsResult.teams;
方式二:遍历数组判断key(适用于不确定元素顺序的情况)
// 假设已通过Dio获取到response final responseData = response.data as List<dynamic>; PlayersFilterResult? playersResult; TeamsFilterResult? teamsResult; for (final item in responseData) { if (item.containsKey('getPlayersFilterResult')) { playersResult = PlayersFilterResult.fromJson(item['getPlayersFilterResult']); } else if (item.containsKey('getTeamsFilterResult')) { teamsResult = TeamsFilterResult.fromJson(item['getTeamsFilterResult']); } } // 使用前可先判空 if (playersResult != null) { // 处理球员列表 } if (teamsResult != null) { // 处理队伍列表 }
注意事项
- 模型类中的字段要和JSON里的key严格对应(注意大小写,比如JSON中的
Players对应模型解析时的json['Players']) - 如果JSON中存在可能为null的字段,记得在
fromJson工厂方法中做null处理,避免运行时错误 - 可以使用代码生成工具(如json_serializable)来自动生成模型类的序列化/反序列化代码,减少手动编写的工作量
内容的提问来源于stack exchange,提问作者galil3o
相关产品推荐
相关产品推荐

