Home > Software engineering >  How I can access JSON data for two brackets. - Retrofit2
How I can access JSON data for two brackets. - Retrofit2

Time:11-25

I am working with an api that displays currency prices. Although I tried many times, I could not find a way to follow the JSON map. So I can't access the data.

My JSON format below



{"USD":{"satis":"18.6391","alis":"18.6268","degisim":"0.07"},"EUR":{"satis":"19.2998","alis":"19.2894","degisim":"0.57"}

my api interface code below:

interface CurrencyAPI {

    @GET("embed/para-birimleri.json")

    fun getData(): Call<List<CurrencyModel>>

}

my main class

private fun loadData()
{
    val  retrofit=Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    val service=retrofit.create(CurrencyAPI::class.java)
    val call=service.getData()

    call.enqueue(object :Callback<List<CurrencyModel>>

    {
        override fun onResponse(
            call: Call<List<CurrencyModel>>,
            response: Response<List<CurrencyModel>>
        ) {
            if (response.isSuccessful)
            {
                response.body()?.let {

                    currencyModels=ArrayList(it)
                    
                }
            }
        }

        override fun onFailure(call: Call<List<CurrencyModel>>, t: Throwable) {
            t.printStackTrace()
        }

    })
}

my model class


import com.google.gson.annotations.SerializedName

data class CurrencyModel(
    @SerializedName("satis")
    val selling:String,

    @SerializedName("alis")
    val buying:String,

    @SerializedName("degisim")
    val change:String
)

I tried data via list but I Could not get data.

CodePudding user response:

Each time you see { in JSON it represents the start of a new object, which means that you have a top level object that has multiple values (in your case USD and EUR) that are each objects themselves. You've created a class representing these inner objects correctly, but you are incorrectly trying to deserialize the entire JSON body as a list/array rather than an object. Now, there are a few things to consider when deciding how to deserialize the entire JSON body:

  1. Do you know all of the possible keys ahead of time?
  2. Will these keys stay the same for the foreseeable future?
  3. Are these keys static or dynamic?

If you answered no to either of the first 2 questions, or answered dynamic to the last one, then you won't want to make a class representing the object and use a Map<String, CurrencyModel> instead. If you answered yes to both of the first 2 questions, and the answer to the last one was static, then you can make a class to represent the entire body, where each property of the class has type CurrencyModel, though you can still use the map above.

  • Related