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

Retrofit切换电影ID请求崩溃:JsonSyntaxException异常求助

问题原因

崩溃的核心是数据模型与API返回结构不匹配:
TMDB API的belongs_to_collection字段,当电影属于某个系列时返回的是JSON对象;无所属系列时返回null。但你的MovieDetailsModel中将该字段定义为String类型,Gson解析遇到对象时直接抛出JsonSyntaxException。

解决方案

1. 创建所属系列的模型类

先定义belongs_to_collection对应的对象结构:

data class CollectionModel(
    @SerializedName("id") val id: Int,
    @SerializedName("name") val name: String,
    @SerializedName("poster_path") val posterPath: String?,
    @SerializedName("backdrop_path") val backdropPath: String?
)

2. 修改MovieDetailsModel的对应字段

将belongsToCollection的类型改为CollectionModel?(可空类型,兼容无系列的场景),同时建议把其他可能返回null的字段也改为可空,避免后续潜在崩溃:

data class MovieDetailsModel(
    @SerializedName("id")
    val id: Int,
    @SerializedName("adult")
    val adult: Boolean,
    @SerializedName("backdrop_path")
    val backdropPath: String?, // 改为可空
    @SerializedName("belongs_to_collection")
    val belongsToCollection: CollectionModel?, // 修改为可空对象类型
    @SerializedName("budget")
    val budget: Int,
    @SerializedName("genres")
    val genres: List<GenreModel>,
    @SerializedName("homepage")
    val homepage: String?, // 改为可空
    @SerializedName("imdb_id")
    val imdbId: String?, // 改为可空
    @SerializedName("original_language")
    val originalLanguage: String,
    @SerializedName("original_title")
    val originalTitle: String,
    @SerializedName("overview")
    val overview: String,
    @SerializedName("popularity")
    val popularity: Double,
    @SerializedName("poster_path")
    val posterPath: String?, // 改为可空
    @SerializedName("production_companies")
    val productionCompanies: List<CompanyModel>,
    @SerializedName("production_countries")
    val productionCountries: List<CountryModel>,
    @SerializedName("release_date")
    val releaseDate: String,
    @SerializedName("revenue")
    val revenue: Int,
    @SerializedName("runtime")
    val runtime: Int,
    @SerializedName("spoken_languages")
    val spokenLanguages: List<LanguageModel>,
    @SerializedName("status")
    val status: String,
    @SerializedName("tagline")
    val tagline: String?, // 改为可空
    @SerializedName("title")
    val title: String,
    @SerializedName("video")
    val video: Boolean,
    @SerializedName("vote_average")
    val voteAverage: Double,
    @SerializedName("vote_count")
    val voteCount: Int
)

3. 验证API返回

如果对字段类型存疑,可直接通过Postman或浏览器调用目标电影ID的API,查看belongs_to_collection的实际返回格式,确保模型类与API结构完全匹配。


内容的提问来源于stack exchange,提问作者Antony Lajes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:35:11