Android中如何将带数字键的JSON对象转换为列表?
解决方案:动态键JSON转Android DTO并解析为列表
问题分析
服务器返回的episodes字段是动态字符串数字为键、对应剧集列表的对象,你尝试用Map<String, List<Episode>>解析失败,但单个键对应的列表能正常解析,说明问题出在顶层DTO的定义或序列化配置上,而非Episode/EpisodeInfo结构。
1. 修正DTO结构(核心解决步骤)
首先调整顶层类命名避免与字段名冲突,同时确保序列化注解匹配使用的库(Gson/Moshi):
若使用Gson:
data class EpisodesResponse( @SerializedName("episodes") val episodesMap: Map<String, List<EpisodesResponse.Episode>> ) { data class Episode( @SerializedName("id") val id: String, @SerializedName("episode_num") val num: String, @SerializedName("title") val title: String, @SerializedName("container_extension") val extension: String, @SerializedName("info") val info: EpisodeInfo ) { data class EpisodeInfo( @SerializedName("movie_image") val thumbnail: String, @SerializedName("cover_big") val cover: String, @SerializedName("rating") val rating: Double, @SerializedName("release_date") val releaseDate: String, @SerializedName("duration") val duration: String ) } }
若使用Moshi:
替换@SerializedName为Moshi的@Json注解:
import com.squareup.moshi.Json data class EpisodesResponse( @Json(name = "episodes") val episodesMap: Map<String, List<EpisodesResponse.Episode>> ) { data class Episode( @Json(name = "id") val id: String, @Json(name = "episode_num") val num: String, @Json(name = "title") val title: String, @Json(name = "container_extension") val extension: String, @Json(name = "info") val info: EpisodeInfo ) { data class EpisodeInfo( @Json(name = "movie_image") val thumbnail: String, @Json(name = "cover_big") val cover: String, @Json(name = "rating") val rating: Double, @Json(name = "release_date") val releaseDate: String, @Json(name = "duration") val duration: String ) } }
2. 解析JSON并转换为统一列表
以Gson为例,解析后将Map中所有值合并为单个剧集列表:
// 服务器返回的JSON字符串 val jsonResponse = "..." val gson = Gson() val response = gson.fromJson(jsonResponse, EpisodesResponse::class.java) // 合并所有动态键对应的剧集列表 val allEpisodes: List<EpisodesResponse.Episode> = response.episodesMap.values.flatten()
3. 常见排查点
- 确认序列化库依赖已正确引入(Gson/Moshi)
- 检查是否存在自定义序列化适配器干扰默认解析逻辑
- 验证JSON字符串格式合法(可通过在线JSON校验工具确认)
内容的提问来源于stack exchange,提问作者Abdelrahman Ashref
相关产品推荐
相关产品推荐

