java.lang.IllegalStateException: ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY дооснащен, kotlin - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь реализовать регистрацию пользователей в моем приложении, используя 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)
}

}

Модификация 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 ]

3 голосов
/ 13 октября 2019

В вашем предыдущем вопросе вы достигли конечной точки 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>
0 голосов
/ 13 октября 2019

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> вместо вашего пользовательского типа и зарегистрируйте то, что фактически возвращается с вашего сервера. Тогда вы можете действовать соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...