另一个“预期为BEGIN_OBJECT,但为BEGIN_ARRAY”的问题

时间:2019-06-28 10:30:30

标签: android kotlin retrofit2

我正在尝试更改此项目代码(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>>
    }

要使它在我的数据类中起作用,我需要进行哪些更改?

2 个答案:

答案 0 :(得分:1)

  

预期为BEGIN_OBJECT,但为BEGIN_ARRAY

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

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

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

答案 1 :(得分:0)

问题是您期望应用程序中出现JSON object,而api返回JSON array。您的服务应如下所示:

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

更改之后,您可以删除ReposResponse类,因为您不再使用该结构