user3513024
user3513024

Reputation: 1

Json deserialization with Gson in kotlin

I wanted to deserialize json with Kotlin using GSON. But it returns Null. Json starts with object.

This is the Json

    val json = """{
        "05-04-2018": [
        {
            "start_datetime": "2018-04-05 20:00:00",
            "event_id": "1",
            "event_title": "Anna Karenina",
            "city_id": "1",
            "stage_name": "Cüneyt Gökçer Sahnesi",
            "address": "Çayyolu Ankara"
        }
        ],
        "07-04-2018": [
        {
            "start_datetime": "2018-04-07 15:00:00",
            "event_id": "1",
            "event_title": "Anna Karenina",
            "city_id": "1",
            "stage_name": "Cüneyt Gökçer Sahnesi",
            "address": "Çayyolu Ankara"
        },
        {
            "start_datetime": "2018-04-07 20:00:00",
            "event_id": "1",
            "event_title": "Anna Karenina",
            "city_id": "1",
            "stage_name": "Cüneyt Gökçer Sahnesi",
            "address": "Çayyolu Ankara"
        }
        ]
    }"""

Classes which include List of Events. Another one is the class of items.

    data class Event (val event_id: Int,val event_title: String, val event_stage: String, val event_posterUri: String, val event_starttime: String)
    data class EventArray (val dates: String, val eventArrayList: ArrayList<Event>)

And GSON part

    val sadasd: EventArray = gson.fromJson(json, EventArray::class.java)

Upvotes: 0

Views: 3930

Answers (2)

Satej S
Satej S

Reputation: 2156

So I understand the date is dynamic. Incase you're not able to change the API design, this is one approach.

You parse the JSON using the JsonParser like this :

val parsedJson = JsonParser().parse(json).asJsonObject

Extract the keys from this

val keys = parsedJson.keySet();

Iterate through the keys, extract the content as a JsonArray , and then iterate over each and map it to the class.

for (key in keys) {
        var eventArray = parsedJson[key].asJsonArray
        eventArray.forEach {
            val event = Gson().fromJson(it.asJsonObject, Event::class.java)
            print(event)
        }
    }

Ideally you want to have better JSON to begin with.

Upvotes: 2

ice1000
ice1000

Reputation: 6569

Please re-try with these data classes:

data class EventArray(
        val `05-04-2018`: List<Event>,
        val `07-04-2018`: List<Event>
)

data class Event(
        val start_datetime: String,
        val event_id: String,
        val event_title: String,
        val city_id: String,
        val stage_name: String,
        val address: String
)

With these data classes I run println(Gson().fromJson(json, EventArray::class.java)) and get:

EventArray(05-04-2018=[Event(start_datetime=2018-04-05 20:00:00, event_id=1, event_title=Anna Karenina, city_id=1, stage_name=Cüneyt Gökçer Sahnesi, address=Çayyolu Ankara)], 07-04-2018=[Event(start_datetime=2018-04-07 15:00:00, event_id=1, event_title=Anna Karenina, city_id=1, stage_name=Cüneyt Gökçer Sahnesi, address=Çayyolu Ankara), Event(start_datetime=2018-04-07 20:00:00, event_id=1, event_title=Anna Karenina, city_id=1, stage_name=Cüneyt Gökçer Sahnesi, address=Çayyolu Ankara)])

Upvotes: 0

Related Questions