kotlin 使用GSON解析不同类的列表

7lrncoxx  于 2023-02-13  发布在  Kotlin
关注(0)|答案(1)|浏览(208)

我需要将日程表存储在一个JSON文件中,以便在需要时再次加载到应用中。日程表使用以下三个类存储:

data class DayScheduleItem(
    var hourAndMin: Calendar = Calendar.getInstance(),
): ScheduleItem() 

data class ExceptionItem(
    var fromDate: Calendar = Calendar.getInstance(),
    var toDate: Calendar = Calendar.getInstance(),
): ScheduleItem() 

data class WeekDayScheduleItem(
    var name: String,
): ScheduleItem() {
    var isOpen: Boolean = false  
}

然后是超类:

class ScheduleItem {
    var id: Int? = null
        get() = field
        set(value) {
            field= value
        }
    var data: List<Byte> = emptyList()
        get() = field
        set(value) {
            field = value
        }
}

现在我有一个列表如下:

[
    [
         DayScheduleItem1,
         DayScheduleItem2
    ],
    [
         WeekDayScheduleItem1,
         WeekDayScheduleItem2,
         WeekDayScheduleItem3,
         WeekDayScheduleItem4
    ],
    [
    ]
]

这些问题是:
1.如何使用GSON.fromJson()解析这个json?
1.我需要简化我的课程吗?
1.我是否需要使用另一个像莫希这样的图书馆?
1.我应该改变JSON的结构吗?

p8ekf7hl

p8ekf7hl1#

1.如何使用GSON.fromJson()解析这个json?
Gson不提供现成的多态性支持,请参阅this one等相关问题。通常,您必须在每个计划项目的JSON数据中包含某种类型的标识符,然后在反序列化时基于此标识符决定反序列化哪个计划项目子类。
Jackson库对此提供了内置支持,它还支持deduction-based polymorphismdeduction-based polymorphism只根据属性来决定数据代表哪个类,而不需要JSON中的单独属性,尽管在将来添加或删除属性时,这可能会有点难以维护。
3.我是否需要使用另一个像莫希这样的图书馆?
您可以使用Gson实现这一点,但是对于您的用例,另一个库可能更合适:

  • 如上所述,Jackson提供了对多态性的内置支持
  • Gson主要是为Java设计的,它的Kotlin支持有限;莫希和Jackson明确支持Kotlin,因此可能更易于用于Kotlin项目

4.我应该改变JSON的结构吗?
对于您的用例,如果值始终按JSON数据中的调度类型分组,则实际上可能不需要多态性支持。如果使用JSON对象对调度项进行分组,则会更简单:

{
    "day": [
        DayScheduleItem1,
        DayScheduleItem2
    ],
    "weekday": [
        WeekDayScheduleItem1,
        WeekDayScheduleItem2
    ],
    ...
}

然后,您可以编写一个将所有这些条目作为属性的数据类,例如val day: List<DayScheduleItem>,并对该数据类进行序列化和反序列化。

相关问题