Я использую 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. Может кто-нибудь помочь с этой проблемой?