4ankoku
4ankoku

Reputation: 25

Kotlin - Parse JSON Object using retrofit gson

Currently my API look like this. you can check on https://indonesia-covid-19-api.now.sh/api/provinsi/

{
  "data": [
    {
      "fid": 11,
      "kodeProvi": 31,
      "provinsi": "DKI Jakarta",
      "kasusPosi": 164577,
      "kasusSemb": 148237,
      "kasusMeni": 3087
    },
    {
      "fid": 15,
      "kodeProvi": 35,
      "provinsi": "Jawa Timur",
      "kasusPosi": 76111,
      "kasusSemb": 65382,
      "kasusMeni": 5254
    },
    {
      "fid": 35,
      "kodeProvi": 0,
      "provinsi": "Indonesia",
      "kasusPosi": 0,
      "kasusSemb": 0,
      "kasusMeni": 0
    }
  ]
}

And this is my model

province.kt

@Parcelize
data class Province(
    @SerializedName("data")
    val data: MutableList<Data>?
): Parcelable

data.kt

@Parcelize
data class Data(
    @SerializedName("fid")
    val fid: String?,
    @SerializedName("kasusMeni")
    val kasusMeni: String?,
    @SerializedName("kasusPosi")
    val kasusPosi: String?,
    @SerializedName("kasusSemb")
    val kasusSemb: String?,
    @SerializedName("kodeProvi")
    val kodeProvi: String?,
    @SerializedName("provinsi")
    val provinsi: String?
): Parcelable

What i wan't is getting the list inside the object. What've i tried to do is

Interface.kt

@GET("api/provinsi/")
fun getProvinceDetails(): Single<Province>

DataSource.kt

...
private val _networkState  = MutableLiveData<NetworkState>()
val networkState: LiveData<NetworkState>
    get() = _networkState
...
private val _provinceDetailsResponse = MutableLiveData<Province>()
val provinceDetailsResponse: LiveData<Province>
    get() = _provinceDetailsResponse
...
fun fetchProvinceDetails() {

    _networkState.postValue(NetworkState.LOADING)
    try {
        compositeDisposable.add(
            apiService.getProvinceDetails()
                 .subscribeOn(Schedulers.io())
                 .subscribe({
                         _provinceDetailsResponse.postValue(it)
                         _networkState.postValue(NetworkState.LOADED)
                      },
                      {
                         _networkState.postValue(NetworkState.ERROR)
                         Log.e("DataSource", it.message!!)
                      }
                  )
            )

        }

    catch (e: Exception){
        Log.e("DataSource", e.message!!)
    }
}

I'm trying to get the array/list inside the JSONObject so i can use fetch it in my adapter. Any help would be appreciated.

Upvotes: 0

Views: 213

Answers (1)

Mohit Ajwani
Mohit Ajwani

Reputation: 1338

Your Province.kt file should change the data type to be an ArrayList

Also, please see that you have added to the Retrofit builder for the conversion.

.addConverterFactory(GsonConverterFactory.create(gsonProviderInstanceHere))

Hope this helps in fixing the issue.

Upvotes: 1

Related Questions