【问题标题】:Json deserialization with Gson in kotlin在 kotlin 中使用 Gson 进行 Json 反序列化
【发布时间】:2018-04-06 09:22:13
【问题描述】:

我想使用 GSON 使用 Kotlin 反序列化 json。但它返回 Null。 Json 以对象开头。

这是 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"
        }
        ]
    }"""

包含事件列表的类。另一个是物品的类别。

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

还有 GSON 部分

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

【问题讨论】:

    标签: kotlin gson deserialization


    【解决方案1】:

    所以我知道日期是动态的。如果您无法更改 API 设计,这是一种方法。

    您使用 JsonParser 解析 JSON,如下所示:

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

    从中提取密钥

    val keys = parsedJson.keySet();
    

    遍历键,将内容提取为 JsonArray ,然后遍历每个键并将其映射到类。

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

    理想情况下,您希望一开始就拥有更好的 JSON。

    【讨论】:

    • 感谢您的解决方案。我可以重新排列 Json。在这种情况下,您有什么报价吗?
    • @user3513024 只需将所有对象放入一个数组中,而不是嵌套对象中的单独数组。 "start_datetime" 值已包含日期,无需按日期分隔每个对象。
    【解决方案2】:

    请使用这些数据类重试:

    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
    )
    

    使用这些数据类,我运行 println(Gson().fromJson(json, EventArray::class.java)) 并得到:

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

    【讨论】:

    • 但这取决于日期。所以它是动态的。有没有办法做动态?
    • 没办法,因为你的 json 格式设计得很糟糕。如果你想要更好的 json 格式,那就另当别论了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多