Обработка ответа Kotlin Retrofit

Я новичок в разработке Kotlin и Android. Я изо всех сил пытался заставить мой модифицированный API работать. Но нашел способ сделать это после некоторого поиска на SO. Я получаю ответ данных сейчас, но я не знаю, как его «отделить», чтобы я мог с ним работать.

это мой ответ json:

"data": [
    {
        "alpha2Code": "PT",
        "name": "Portugal",
        "prefixCode": null,
        "id": "9ba94c99-7362-47c2-f31f-08d87a662921",
        "active": true,
        "created": "2020-10-27T10:50:46.895831"
    }

и мой модельный класс

data class Country (
    @SerializedName("alpha2Code")
    val alpha2Code: String?,
    @SerializedName("name")
    val name: String?,
    @SerializedName("id")
    val id: String?,
    @SerializedName("active")
    val active: Boolean,
    @SerializedName("created")
    val created: String?
): Serializable


class Countrys {
    var countrys: List<Country> = emptyList()
}

и, наконец, моя функция получения данных

fun getDataCountry() {
    val call: Call<Countrys> = ApiClient.getClient.getCountries()

    call.enqueue(object : Callback<Countrys> {
        override fun onResponse(call: Call<Countrys>?, response: Response<Countrys>?) {
            // val carResponse = response.body()
            val body = response?.body()
            Log.e("dadosApi2","retorno response: " + body)
        }

        override fun onFailure(call: Call<Countrys>?, t: Throwable) {
            Log.e("dadosApiError","erro no retorno " + t.message)
        }
    })
}

Я получаю ответ, но не знаю, как развернуть данные, чтобы, например, добавить все названия стран в ArrayList.

Я пытался сделать это без класса Countrys, используя <List> или Arraylist, но я получаю сообщение об ошибке в своем ответе:

E/dadosApiError: erro no retorno Ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1 столбца 2 пути $

fun getDataCountry() {
    val call: Call<ArrayList<Country>> = ApiClient.getClient.getCountries()
    call.enqueue(object : Callback<ArrayList<Country>> {

        override fun onResponse(call: Call<ArrayList<Country>>?, response: Response<ArrayList<Country>>?) {
            // val carResponse = response.body()
            val body = response?.body()

            Log.e("dadosApi2","retorno response: " + body)

        }

        override fun onFailure(call: Call<ArrayList<Country>>?, t: Throwable) {
            Log.e("dadosApiError","erro no retorno " + t.message)
        }

    })
}

Я также пытался ранее со списком

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
977
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

вам нужно будет изменить класс Countrys на data class и добавить SerializedNamedata для объекта countrys вот так

data class Countrys(@SerializedName("data")var countrys: List<Country>)

то вы можете получить доступ к своим данным с помощью этого

var countryNames = mutableListOf<String>()
for (country in response?.body().countrys){
  countryNames.add(country.name)
}

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

CodePT 16.12.2020 12:22

E/dadosApiError: erro no retorno Ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1 столбца 2 пути $

CodePT 16.12.2020 12:27

это просто разница в типе объекта, если List у вас не работает, попробуйте ArrayList

Mahmoud Omara 16.12.2020 12:28

вы также должны отредактировать свой вопрос, включив в него ошибку и указав строку, в которой это происходит.

Mahmoud Omara 16.12.2020 12:28

я пропустил это, кстати, если вы делаете ответ?.body(), это не сработает, так как вы все еще используете страны, вам придется использовать это сейчас, чтобы получить доступ к ответу данных?.body().countrys

Mahmoud Omara 16.12.2020 12:31

Я пробую эти предложения, но до сих пор не решил свою проблему. Продолжайте получать ту же ошибку, когда я прекращаю использовать класс Countrys

CodePT 16.12.2020 12:36

обновите свой вопрос с текущим кодом и ошибкой, чтобы я мог помочь вам правильно

Mahmoud Omara 16.12.2020 12:37

когда вы сказали изменить ответ?.body().countries, я не могу получить к нему доступ.

CodePT 16.12.2020 12:40

установите Countrys как класс данных, как и этот класс данных Countrys (var countrys: List<Country>) и повторите попытку.

Mahmoud Omara 16.12.2020 12:42

после этого теперь ответ нулевой

CodePT 16.12.2020 12:46

Вы добавили сериализованное название для стран? что такое "данные"

Mahmoud Omara 16.12.2020 12:47

да, вы правы, спасибо за вашу помощь. Очень признателен!

CodePT 16.12.2020 12:56

я обновлю свой ответ, и если это решило вашу проблему, я думаю, вы должны отметить это, чтобы другие могли помочь им в будущем.

Mahmoud Omara 16.12.2020 12:57

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