我需要将日程表存储在一个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的结构吗?
1条答案
按热度按时间p8ekf7hl1#
1.如何使用GSON.fromJson()解析这个json?
Gson不提供现成的多态性支持,请参阅this one等相关问题。通常,您必须在每个计划项目的JSON数据中包含某种类型的标识符,然后在反序列化时基于此标识符决定反序列化哪个计划项目子类。
Jackson库对此提供了内置支持,它还支持deduction-based polymorphism,deduction-based polymorphism只根据属性来决定数据代表哪个类,而不需要JSON中的单独属性,尽管在将来添加或删除属性时,这可能会有点难以维护。
3.我是否需要使用另一个像莫希这样的图书馆?
您可以使用Gson实现这一点,但是对于您的用例,另一个库可能更合适:
4.我应该改变JSON的结构吗?
对于您的用例,如果值始终按JSON数据中的调度类型分组,则实际上可能不需要多态性支持。如果使用JSON对象对调度项进行分组,则会更简单:
然后,您可以编写一个将所有这些条目作为属性的数据类,例如
val day: List<DayScheduleItem>
,并对该数据类进行序列化和反序列化。