Handle Response Kotlin Retrofit

Tags: , , , ,



I’m new to Kotlin and android development. Have been struggling to get my retrofit api to work.
But have found a way to do it after some search on SO. I get the data response now, but I don’t know how to “separate” it, so that i can work around with it.

this is my json response:

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

and my model class

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()
}

and finally my get data function

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)
        }
    })
}

I get the response, but I don’t know how to unfold the data, so that I can for example add all country names to an ArrayList.

I have tried doing this without the class Countrys, using <List> or Arraylist but i get the error on my response:

E/dadosApiError: erro no retorno Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

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)
        }

    })
}

I have also tried previously with List

Answer

you will need to change Countrys class into a data class and add the SerializedName data for the object countrys like this

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

then you can access your data by using this

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


Source: stackoverflow