android - Kotlin 中的错误(改造)预期为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT

标签 android kotlin retrofit2

大家好,我是 Kotlin 的新手,我正在尝试为我的后端实现改造 api 调用。我在 logcat 中收到此错误:预期为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT $ 欢迎提供任何建议。


import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;

public interface Api {

    @GET("api/users")
    fun getUsers(): Call<List<UsersItem>>
    

}

这是我的数据类:

package com.example.mtaa

data class UsersItem(
    val branches: List<Any>,
    val id: Int,
    val mail: String,
    val name: String,
    val password: String,
    val preferred_branch: String,
    val profile_pic: String,
    val reservations: List<Any>,
    val sub_at: String
)

此代码位于MainActivity中

private fun getMyUsers() {
        val retrofitBuilder = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(BASE_URL)
            .build()
            .create(Api::class.java)
        val retrofitData = retrofitBuilder.getUsers()

        retrofitData.enqueue(object : Callback<List<UsersItem>?> {
            override fun onResponse(
                call: Call<List<UsersItem>?>,
                response: Response<List<UsersItem>?>
            ) {
                val responseBody = response.body()!!

                val myStringBuilder = StringBuilder()
                for(myData in responseBody){
                    myStringBuilder.append(myData.name)
                    myStringBuilder.append("\n")
                }

                binding.txtId.text = myStringBuilder

            }
            override fun onFailure(call: Call<List<UsersItem>?>, t: Throwable) {
                Log.d("ERROR With BE", "Error:" + t.message)
            }
        })
    }

这是我从 django 后端获取的 JSON

{
"results":[
    "id": 1,
    "password": "*******",
    "name": "Name Surname",
    "mail": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="365b575f5a765b575f5a184e4f" rel="noreferrer noopener nofollow">[email protected]</a>",
    "preferred_branch": "City",
    "sub_at": "2022-02-04",
    "profile_pic": "path",
    "branches": {
        "id": 1,
        "location": "City",
        "gym_capacity": X,
        "pool_capacity": X,
        "sauna_capacity": X
    },
    "reservations": []
],
...
}

最佳答案

在您的 Retrofit 服务中,您表示您期望 List要返回的项目,但您的 API 返回的是单个对象,其中包含一个列表。

您想要做的是创建一个名为 UserResults 的类型(或类似的东西)包含 results属性,这是 List<UsersItem> .

data class UserResults(
    val results: List<UsersItem>
)

然后,您的 Retrofit 函数可以返回这个新类型:

@GET("api/users")
fun getUsers(): Call<UserResults>

关于android - Kotlin 中的错误(改造)预期为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71916216/

相关文章:

java - android Gradle同步错误(匹配版本)

flutter - 当我将 better_player flutter 包添加到 pubspec.yaml 中的依赖项时,应用程序无法运行

android - retrofit 2 : No virtual method newJsonReader(Ljava/io/Reader;) NoSuchMethodException

android - 在Interceptor中抛出IOException会导致Retrofit崩溃

android - 禁用 seekBar 而不调暗

android - android中的灰度位图

Android MVVM 多 API 调用

android - 如何在OkHttp中拦截请求?

android - 在 Fragment 中使用 Observer

android - 找不到引用的类 kotlin.internal.annotations.AvoidUninitializedObjectCopyingCheck