Ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT при использовании GSON в JSON без имени массива - PullRequest
0 голосов
/ 20 октября 2018

Я использую Github API, но сталкиваюсь с проблемой "Ожидается BEGIN_ARRAY, но при использовании GSON был BEGIN_OBJECT", я использую модификацию, чтобы использовать мой API и kotlin для разработки.Я создал модель с сериализацией и менеджер для обработки ответов API, как вы можете видеть выше.

Это JSON, который я потребляю

[
    {
        "url": "https://api.github.com/gists/8ca806eb78108aa2fecef2ab33312444",
        "forks_url": "https://api.github.com/gists/8ca806eb78108aa2fecef2ab33312444/forks",
        "commits_url": "https://api.github.com/gists/8ca806eb78108aa2fecef2ab33312444/commits",
        "id": "8ca806eb78108aa2fecef2ab33312444",
        "node_id": "MDQ6R2lzdDhjYTgwNmViNzgxMDhhYTJmZWNlZjJhYjMzMzEyNDQ0",
        "git_pull_url": "https://gist.github.com/8ca806eb78108aa2fecef2ab33312444.git",
        "git_push_url": "https://gist.github.com/8ca806eb78108aa2fecef2ab33312444.git",
        "html_url": "https://gist.github.com/8ca806eb78108aa2fecef2ab33312444",
        "files": {
            "ps-find-second-highest.js": {
                "filename": "ps-find-second-highest.js",
                "type": "application/javascript",
                "language": "JavaScript",
                "raw_url": "https://gist.githubusercontent.com/oyilmaztekin/8ca806eb78108aa2fecef2ab33312444/raw/dfb0d3e648ca39e9d21c55a77ca057d7175cf725/ps-find-second-highest.js",
                "size": 478
            }
        },
        "public": true,
        "created_at": "2018-10-20T11:10:23Z",
        "updated_at": "2018-10-20T11:10:23Z",
        "description": "",
        "comments": 0,
        "user": null,
        "comments_url": "https://api.github.com/gists/8ca806eb78108aa2fecef2ab33312444/comments",
        "owner": {
            "login": "oyilmaztekin",
            "id": 863600,
            "node_id": "MDQ6VXNlcjg2MzYwMA==",
            "avatar_url": "https://avatars0.githubusercontent.com/u/863600?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/oyilmaztekin",
            "html_url": "https://github.com/oyilmaztekin",
            "followers_url": "https://api.github.com/users/oyilmaztekin/followers",
            "following_url": "https://api.github.com/users/oyilmaztekin/following{/other_user}",
            "gists_url": "https://api.github.com/users/oyilmaztekin/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/oyilmaztekin/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/oyilmaztekin/subscriptions",
            "organizations_url": "https://api.github.com/users/oyilmaztekin/orgs",
            "repos_url": "https://api.github.com/users/oyilmaztekin/repos",
            "events_url": "https://api.github.com/users/oyilmaztekin/events{/privacy}",
            "received_events_url": "https://api.github.com/users/oyilmaztekin/received_events",
            "type": "User",
            "site_admin": false
        },
        "truncated": false
    }

Это моя GistModel (только те части, которые я хочу)

@Entity(tableName = "gists_table")
data class Gist(
    @SerializedName("id") @PrimaryKey(autoGenerate = true) val gistId:Long?,
    @SerializedName("description") val description:String?,
    @SerializedName("comments_url") val commentsUrl:String?,
    @SerializedName("owner") @Embedded val owner:Owner?)

data class Owner(
    @SerializedName("avatar_url") var avatar:String,
    @SerializedName("followers_url") var followers_url:String,
    @SerializedName("following_url") var following_url:String)

Это мой менеджер Guist

fun getGists(
    gistsEndpoint: GitEndpoint,
    page:Int,
    itemsPerPage:Int,
    onSuccess:(repos:List<Gist>) -> Unit,
    onError: (error:String) -> Unit) {

    gistsEndpoint.getGists(page,itemsPerPage).enqueue(
        object : Callback<GistResponse> {

            override fun onFailure(call: Call<GistResponse>?, t: Throwable?) {
                Log.d(ContentValues.TAG, "fail to get data")
                onError(t?.message ?: "unknown error")
            }

            override fun onResponse(
                call: Call<GistResponse>?,
                response: Response<GistResponse>
            ) {
                Log.d(ContentValues.TAG, "got a response $response")
                if (response.isSuccessful) {
                    val repos = response.body()?.data ?: emptyList()
                    onSuccess(repos)
                } else {
                    onError(response.errorBody()?.string() ?: "Unknown error")
                }
            }
        }
    )
}

Это мойGistResponse

/**
 * It will represent the list of gists
 */
data class GistResponse(
    @SerializedName("") val data: List<Gist>)

У меня также есть пограничный вызов для обработки прокрутки представления рециркулятора и времени запросов API, но я не думаю, что это актуально.Я хотел знать, хорошо ли я сериализуюсь, потому что у меня никогда не было JSON с пустым именем массива (обычно начинается с данных [{что-то}], и я вызываю значение "данные" в списке модели, например @SerializedName ("data ") var data: List. Может кто-нибудь помочь с этой проблемой?

...