java.lang.IllegalStateException:应为BEGIN_OBJECT,但已进行BEGIN_ARRAY改造,科特林

时间:2019-10-12 22:54:40

标签: android kotlin retrofit kotlin-coroutines

我正在尝试使用Retrofit在我的应用程序上实现用户注册,但是我一直收到此错误,不确定出什么问题了,java.lang.IllegalStateException:应该是BEGIN_OBJECT,但是是BEGIN_ARRAY

这是邮递员的回复

{
"isSuccessful": true,
"message": "successful",
"user": {
    "name": "Jackline Jazz",
    "email": "jackijazz@gmail.com",
    "phone": "000000"
}

}

我有两个模型类,即User模型类

data class User(
val name: String,
val email:String,
val phone:String

还有登录响应类

data class LoginResponse(
val isSuccessful:Boolean,
val message: String,
val user: List<User>

我的改造对象

object RetrofitClient {

private const val BASE_URL = "http://10.0.2.2:7000/"

val instance: RetrofitApi by lazy {
    val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

retrofit.create(RetrofitApi::class.java)
}

}

Retrofit API

@FormUrlEncoded
@POST("users/register")
fun userRegister(
    @Field("name") name: String,
    @Field("email") email: String,
    @Field("password") password: String,
    @Field("confirmPassword") confirmPassword: String
): Call<LoginResponse>

和我的注册课程

RetrofitClient.instance.userRegister(name, email, password, confirmPassword)
            .enqueue(object : Callback<LoginResponse> {
                override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                    Toast.makeText(applicationContext, t.message, Toast.LENGTH_LONG).show()`
                }

                override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
                    if (response.body()?.isSuccessful!!){

                        val intent = Intent(applicationContext, MainActivity::class.java)

                        startActivity(intent)

                    }else{
                        Toast.makeText(applicationContext, response.body()?.message, Toast.LENGTH_LONG).show()
                    }
                }

            })
    }
}

如果可能的话,有人可以帮助我实现Kotlin协程

2 个答案:

答案 0 :(得分:3)

your previous question中,您正在命中一个users/login端点。您创建了一个LoginResponse来模拟服务器响应。在那里,users/login返回了一个List<User>,因此必须这样设置LoginResponse

现在,您正在命中一个users/register端点...但是您仍在尝试使用LoginResponse。从JSON中可以看到,您正在从只有一个用户的服务器中获取不同的JSON 。结果,您需要一个不同的响应类(例如RegisterResponse)来为这个新响应建模:

data class RegisterResponse(
  val isSuccessful:Boolean,
  val message: String,
  val user: User
)

@FormUrlEncoded
@POST("users/register")
fun userRegister(
    @Field("name") name: String,
    @Field("email") email: String,
    @Field("password") password: String,
    @Field("confirmPassword") confirmPassword: String
): Call<RegisterResponse>

答案 1 :(得分:0)

BEGIN_ARRAY表示返回了一些包含JSON数组([])的JSON,您的对象架构中将使用JSON对象({})。 有时,API根据所处理的客户端返回不同的响应,因此最好在代码中调试问题。一种方法是暂时使用Retrofit的标量转换器工厂。

添加此依赖项:

dependencies {
    implementation 'com.squareup.retrofit2:converter-scalars:<your-retrofit-version>'
}

和此代码

val retrofit = new Retrofit.Builder()  
        .addConverterFactory(ScalarsConverterFactory.create())
        ...

并返回Callable<String>而不是自定义类型,并记录服务器实际返回的内容。然后您可以据此采取行动。