首页 > 解决方案 > 另一个“预期为 BEGIN_OBJECT 但为 BEGIN_ARRAY”的问题

问题描述

我正在尝试更改此项目代码 ( https://github.com/rygelouv/networkcall-sample ) 以从另一个 URL 获取数据,但我无法修复“预期 BEGIN_OBJECT 但为 BEGIN_ARRAY”响应错误。Json响应就像 [{"value":"1","label":"ADMIN"},{"value":"2","label":"EMPLOYEE_1"}...]

而最初的回应是

{"count": 61700,"result: false,"items": [{"id": 3436,"node":DEwOlJlyMjY2"...},{....}]}

我知道我必须更改返回类型以接受 Array 类型,但由于 DSL,我无法弄清楚如何/在哪里做。在下面的代码中,我只更改了存储库类以满足我的需要:

object Repository {
    fun getRepos() = networkCall<ReposResponse, List<Employee>> {
        client = GithubAPI.githubService.getRepos()
        var result = GithubAPI.githubService.getRepos()
    }
}

data class Employee(
        @SerializedName("label")
        val name: String,

        @SerializedName("value")
        val idEmployee: String
)

data class ReposResponse(val items: List<Employee>): BaseApiResponse<Employee>(), DataResponse<List<Employee>> {
    override fun retrieveData(): List<Employee> = items
}

abstract class BaseApiResponse<T> {
    var total_count: Int = 0
    var incomplete_results: Boolean = false
}

object GithubAPI {
    var API_BASE_URL: String = "my_url"
    var httpClient = OkHttpClient.Builder()
    var builder: Retrofit.Builder = Retrofit.Builder()
            .baseUrl(API_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
    var retrofit = builder
            .client(httpClient.build())
            .build()

    var githubService = retrofit.create<GithubService>(GithubService::class.java)


    interface GithubService {
        @GET("workstation")
        fun getRepos(): Deferred<Response<ReposResponse>>
    }

我必须进行哪些更改才能使其适用于我的数据类?

标签: androidkotlinretrofit2

解决方案


应为 BEGIN_OBJECT,但为 BEGIN_ARRAY

JsonSyntaxException当 Gson 尝试读取(或写入)格式错误的 JSON 元素时会引发此异常。

您应该更改接口回调参数。添加列表类型。

interface GithubService {
        @GET("workstation")
        fun getRepos(): Deferred<Response<List<Employee>>
    }

推荐阅读