Модернизация ответа null в классе данных

Я новичок в Котлине. Мой первый проект - использовать API для отдыха. Я уже сделал это, используя модификацию. Но у меня проблема, когда я регистрирую ответ, мой класс данных равен нулю. Я не знаю, где ошибка.

Мой клиент по ремонту

object RetrofitClient {
    var retrofit: Retrofit? = null

    fun getClient(baseUrl: String): Retrofit? {
        if (retrofit == null) {
            //TODO While release in Google Play Change the Level to NONE
            val interceptor = HttpLoggingInterceptor()
            interceptor.level = HttpLoggingInterceptor.Level.BODY
            val client = OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .connectTimeout(100, TimeUnit.SECONDS)
                .readTimeout(100, TimeUnit.SECONDS)
                .build()

            retrofit = Retrofit.Builder()
                .client(client)
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        }

        return retrofit

    }
}

Мой интерфейс

public interface ApiLoginService {

    @POST("UserManagementCoreAPI/api/v1/users")
    fun loginService(@Body request: RequestBody): Call<DataLogin>
}


object ApiUtils {

    val BASE_URL = "------"

    val apiLoginService: ApiLoginService
        get() = RetrofitClient.getClient(BASE_URL)!!.create(ApiLoginService::class.java)

}

Данные моего класса

data class DataLogin (
    @SerializedName("employeeId") val employeeId : String,
    @SerializedName("fullName") val fullName : String,
    @SerializedName("loginConfins") val loginConfins : String,
    @SerializedName("branchId") val branchId : String,
    @SerializedName("isActive") val isActive : String
)

Основная деятельность

mApiLoginService!!.loginService(requestBody).enqueue(object : Callback<DataLogin>{
                    override fun onResponse(call: Call<DataLogin>, response: Response<DataLogin>) {
                        if (response.isSuccessful()){
                            if (response.body().toString() == null){
                                Log.d(tag,"Null")
                            }else{
                                Log.d(tag,"Logging In  " + response.body()!!)
                                progressBar.visibility = View.GONE
                                btn_submit.visibility = View.VISIBLE
                                startActivity(Intent(this@MainActivity, HomeActivity::class.java))
                            }
                        }else{
                            Toast.makeText(applicationContext, "Invalid username or password", Toast.LENGTH_LONG).show()
                            Log.d(tag,"Error  " + response.errorBody().toString())
                            progressBar.visibility = View.GONE
                            btn_submit.visibility = View.VISIBLE
                        }
                    }
                    override fun onFailure(call: Call<DataLogin>, t: Throwable) {
                        progressBar.visibility = View.GONE
                        btn_submit.visibility = View.VISIBLE
                    }
                })

Мой журнал ответов

message: Logging In  DataLogin(employeeId=null, fullName=null, loginConfins=null, branchId=null, isActive=null)

Я не знаю, где ошибка и почему мои данные пусты. Если ответ будет успешным, он все равно даст мне null.

Это пример почтальона Модернизация ответа null в классе данных

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 695
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас есть проблема с вашей схемой, ваш класс DataLogin отличается от вашей схемы почтальона, модернизация ожидает: fullName, isActive...., и ответ: заголовок, данные.., вам нужно создать класс, содержащий заголовок как переменная типа Header(errors:List<AnotherClass>), данные как переменная типа Data(data(List<DataLogin>),totalRecord:Int), я бы посоветовал, если вы используете вспомогательный веб-сайт, такой как JSON в класс, проанализируйте там свой ответ почтальона, и он даст вам правильный класс ответа, но он будет в java, вам нужно переписать код самостоятельно просто скопируйте и вставьте в Android Studio, и он преобразует код в Kotlin для вас. (на веб-сайте проверьте Тип источника: JSON)

Большое спасибо, это работает. Но у меня есть другой вопрос. Как отображать только данные (List<DataLogin>?

acinom_ 03.05.2019 09:27

Сначала это должно быть из вашего API, вы помещаете объекты в массив данных, а затем помещаете этот массив данных в другой объект данных, вам нужно изменить внешнее поле данных на массив, а затем помещать объекты непосредственно внутрь него (объект: employeeId, fullname ,...)

ikerfah 03.05.2019 10:40

Это выводится, когда im Log.d Data = DataLogin(data=Data(data=[DataX(branchId=999, employeeId=david999, fullName=MUHAMMAD DAVID, isActive=true, loginConfins=david999)], totalRecord=1), header =Заголовок(ошибки=[])). Как показать только эти данные DataX(branchId=999, employeeId=david999, fullName=MUHAMMAD DAVID, isActive=true, loginConfins=david999)?

acinom_ 06.05.2019 05:21

Вы должны сопоставить структуру json с вашими классами данных, если вы не предоставляете собственный адаптер для Gson. Итак, если вы хотите получить результат, возможно, сработает что-то вроде этого:

data class Response(
    @SerializedName("headers") val headers: List<Any>,
    @SerializedName("data") val data: Data
)

data class Data(
    @SerializedName("data") val data: List<DataLogin>,
    @SerializedName("totalRecord") val totalRecord: Int
)

data class DataLogin (
    @SerializedName("employeeId") val employeeId : String,
    @SerializedName("fullName") val fullName : String,
    @SerializedName("loginConfins") val loginConfins : String,
    @SerializedName("branchId") val branchId : String,
    @SerializedName("isActive") val isActive : String
)

Вам нужно вернуть объект Response из вашего вызова модификации.

Также несколько советов о kotlin, Gson хорошо работает с Java, но у него есть некоторые проблемы с kotlin (о нулевой безопасности). Я использую Moshi, когда языком проекта является kotlin, и он хорошо с ним работает.

Старайтесь не использовать !! в kotlin, потому что это вызовет исключение RuntimeException. Существуют и другие способы проверки нуля и защиты кода от RuntimeExceptions.

Другие вопросы по теме