我正在尝试更改此项目代码(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>>
}
要使它在我的数据类中起作用,我需要进行哪些更改?
答案 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
类,因为您不再使用该结构