改造错误:需要一个字符串,但在第 1 行第 92 列路径 $.belongs_to_collection 处是 BEGIN_OBJECT

问题描述 投票:0回答:1

我需要调用 api 来通过 ID 接收电影的详细信息。当我拨打第一个电话时,它可以正常工作。如果第二个调用与第一个调用具有相同的 ID,它也可以工作,如果我使用相同的 ID 进行调用,依此类推。现在,如果我使用一个 ID 进行第一次调用,并使用另一个 ID 进行第二次调用,应用程序将崩溃并显示以下错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 92 path $.belongs_to_collection

我在这里寻找解决方案,但没有成功。你可以帮帮我吗? 以下是我认为重要的代码。

Retrofit Interceptor

override fun intercept(chain: Interceptor.Chain): Response {

        val request = chain.request()
            .newBuilder()
            .addHeader("accept", "application/json")
            .addHeader("Authorization", Private.theMovieDatabaseHeaderAuthorization)
            .build()

        return chain.proceed(request)
    }

Retrofit Builder

private val client = OkHttpClient.Builder().apply {
        connectTimeout(60, TimeUnit.SECONDS)
        readTimeout(60, TimeUnit.SECONDS)
        addInterceptor(TheMovieDatabaseInterceptor())
    }.build()

    private val retrofit = Retrofit.Builder()
        .baseUrl(Private.theMovieDatabaseBaseUrl)
        .client(client)
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .build()

Retrofit Endpoint

@GET("movie/{movie_id}?language=en-US")
suspend fun getMovieDetails(@Path("movie_id") movieId: String): MovieDetailsModel
MovieDetailsModel

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: String,
    @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
)
Repository

override suspend fun getMovieDetails(movieId: String): MovieDetailsModel {
        return theMovieDatabaseEndpoints.getMovieDetails(movieId)
    }

ViewModel

private val _movieDetails: MutableLiveData<MovieDetailsModel> = MutableLiveData()
val movieDetails: LiveData<MovieDetailsModel> = _movieDetails

private fun getMovieDetails(movieId: String) = viewModelScope.launch {
    Log.d("getMovieDetails", "movieId: $movieId")
    _movieDetails.value = theMovieDatabaseApiUseCase.getMovieDetails(movieId)
}
android kotlin gson retrofit2
1个回答
0
投票
正如 API 文档所述,

belongs_to_collection
不会返回
String

您可以查看更多这里

© www.soinside.com 2019 - 2024. All rights reserved.