Еще один вопрос "Ожидается BEGIN_OBJECT, но был BEGIN_ARRAY" - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь изменить этот код проекта (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"...},{....}]}

Я знаю, что должен изменить тип возвращаемого значения, чтобы принять тип массива, но я не могу понять, как и где это сделать из-за 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 ]

1 голос
/ 28 июня 2019

Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY

JsonSyntaxException Это исключение возникает, когда Gson пытается прочитать (или записать) искаженный элемент JSON.

Вам следует изменить параметр обратного вызова интерфейса. Добавить тип списка.

interface GithubService {
        @GET("workstation")
        fun getRepos(): Deferred<Response<List<Employee>>
    }
0 голосов
/ 28 июня 2019

Проблема в том, что вы ожидаете JSON object в своем приложении, а API возвращает JSON array.Ваш сервис должен выглядеть следующим образом:

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

После этого изменения вы можете удалить класс ReposResponse, потому что вы больше не используете эту структуру

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...