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
相关产品推荐
相关产品推荐

