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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:55:07