Flutter中解析含不定数量季的复杂JSON响应问题
Flutter解析动态Key的JSON剧集字段问题解决办法
问题描述
在Flutter中加载并解析服务器返回的JSON时,自定义Model对大部分字段都能正常解析,但处理episodes字段时遇到了问题。该字段的结构如下:
"episodes": { "1": [ { "id": "63", "episode_num": 1, "title": "Some Name", "container_extension": "mp4", "info": { "director": "", "plot": "", "cast": "", "rating": "", "releasedate": "", "movie_image": "", "genre": "", "duration_secs": 6495, "duration": "01:48:15" } } ] }
这里的episodes下是动态的数字Key(代表季数),实际返回中季数数量不定。在线JSON转Dart工具只能识别单季结构,无法适配多季的动态场景。
解决方法
可以通过两种方式处理这种动态Key的JSON结构:
方法1:遍历所有季的Key
直接获取episodes对应的Map对象,遍历每个季的Key和对应的剧集列表,这种方式适配所有季数情况(包括非连续季数):
// 假设已将JSON解析为Map<String, dynamic>类型的jsonData Map<String, dynamic> episodesMap = jsonData['episodes']; episodesMap.forEach((seasonKey, episodesList) { // seasonKey是字符串类型的季数,比如"1"、"2" // 将剧集列表转换为自定义Episode Model列表 List<Episode> seasonEpisodes = episodesList .map((episodeJson) => Episode.fromJson(episodeJson)) .toList(); // 在这里处理当前季的剧集数据,比如存入列表或展示 });
方法2:按连续季数循环(适用于季数从1开始连续的情况)
如果确定季数是从1开始的连续数字,可以通过循环季数来获取每一季的内容:
Map<String, dynamic> episodesMap = jsonData['episodes']; int totalSeasons = episodesMap.length; for (int i = 1; i <= totalSeasons; i++) { // 将数字i转为字符串作为Key List<dynamic> seasonEpisodesJson = episodesMap['$i']; List<Episode> seasonEpisodes = seasonEpisodesJson .map((episodeJson) => Episode.fromJson(episodeJson)) .toList(); // 处理当前季数据 }
注:如果季数存在断档(比如有第1、3季但无第2季),优先使用方法1,避免出现Key不存在的报错。
内容的提问来源于stack exchange,提问作者SpaceXS
相关产品推荐
相关产品推荐

