Ayush Katuwal
Ayush Katuwal

Reputation: 149

Could not map the json data to pojo class using retrofit

As I viewed the success API response, it seems it is sending the data but the data could not load to its corresponding Pojo class, where the size of ArrayList seems null. The POJO class structure seems fine from my side but could not figure out what the problem is. Here I've provided my log screenshot which returned the API data and the Log I kept to view the ArrayList size:

My Log screenshot

API Response:

{
  "achievementList": [
    {
        "id": "somerandomuuid2",
        "name": "Foodie",
        "url": "https://toppng.com/uploads/preview/achievement-icon-icon-11553495882s4jdqrtwe2.png",
        "rewardPoint": 50,
        "description": "Order 500 Food items.",
        "earnPoint": 500,
        "userPoint": 450,
        "achieved": false
    },
    {
        "id": "somerandomuuid3",
        "name": "Explorer",
        "url": "https://toppng.com/uploads/preview/achievement-icon-icon-11553495882s4jdqrtwe2.png",
        "rewardPoint": 50,
        "description": "Book more than 100 tickets.",
        "earnPoint": 100,
        "userPoint": 0,
        "achieved": false
    }
],
   "totalRewardPoints": 0
}

Achievements (POJO Class)

data class Achievements(
@Json(name = "achievementList")
var achievementsList: ArrayList<AchievementsList>
)

data class AchievementsList(
@Json(name = "id")
var id: String?,

@Json(name = "name")
var name: String?,

@Json(name = "url")
var url: String?,

@Json(name = "rewardPoint")
var rewardPoint: Int?,

@Json(name = "description")
var description: String?,

@Json(name = "earnPoint")
var earnPoint: Int?,

@Json(name = "userPoint")
var userPoint: Int?,

@Json(name = "achieved")
var achieved: Boolean?
)

APIService

fun getUserAchievements(
context: AppCompatActivity,
userId: String,
listener: OnAchievementsListener
) {
APIClient.normalRequest.getUserAchievements(userId)
    .enqueue(object : Callback<Achievements> {
        override fun onFailure(call: Call<Achievements>, t: Throwable) {
            listener.onFailure(ResponseCodes.badRequest, t.localizedMessage!!)
        }

        override fun onResponse(
            call: Call<Achievements>,
            response: Response<Achievements>
        ) {
            when (response.code()) {
                ResponseCodes.success -> {
                    Log.i("ProfileActivity: ", "Response: ${response.body()}")
                    response.body()?.let { listener.onSuccess(it) }
                }
                else -> {
                    when (response.code()) {
                    listener.onFailure(response.code(), "Something went wrong")

                    }
                }
            }
        }
    })
}

Activity

private fun getAchievementsList() {
    appPreferences?.getString(AppPreferences.UUID)?.let {
        getUserAchievements(this, it, object : OnAchievementsListener {
            override fun onFailure(code: Int, description: String) {
                Utils.showToast(this@ProfileActivity, "$code, $description")
            }

            override fun onSuccess(achievements: Achievements?) {
                Log.i(TAG, "Size: ${achievements?.achievementsList?.size}")
            }
        })
    }
}

Upvotes: 0

Views: 488

Answers (1)

Dinesh
Dinesh

Reputation: 1670

Try this:

@SerializedName("achievementList")

instead of

@Json(name = "achievementList")

in POJO class all field

Upvotes: 1

Related Questions