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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:36:23