提问人:msc87 提问时间:2/10/2023 最后编辑:msc87 更新时间:2/13/2023 访问量:46
使用 GSON 解析不同类的列表列表
Parse a list of list of different classes using GSON
问:
我需要将我的计划存储在单个 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
],
[
]
]
问题是:
- 如何使用 GSON.fromJson() 解析此 json?
- 我需要简化我的课程吗?
- 我需要使用其他像 Moshi 这样的库吗?
- 我应该更改 JSON 的结构吗?
答:
1赞
Marcono1234
2/13/2023
#1
1. 如何使用 GSON.fromJson() 解析这个 json?
Gson 不提供开箱即用的多态性支持,请参阅相关问题,例如此问题。通常,您必须在每个计划项的 JSON 数据中包含某种类型标识符,然后在基于此标识符的反序列化时决定要反序列化的计划项子类。
Jackson 库对此有内置支持,它还支持基于演绎的多态性,它只根据数据所代表的类的属性来决定,而不需要 JSON 中的单独属性,尽管这在将来添加或删除属性时可能更难维护。
3. 我需要使用其他像 Moshi 这样的库吗?
你可以用 Gson 来实现这一点,但对于你的用例,另一个库可能更合适:
- 如上所述,Jackson 提供了对多态性的内置支持
- Gson 主要是为 Java 设计的,其 Kotlin 支持有限;Moshi 和 Jackson 明确支持 Kotlin,因此可能更易于用于 Kotlin 项目
4. 我应该更改JSON的结构吗?
如果对于您的用例,值始终按 JSON 数据中的计划类型分组,则实际上可能不需要多态性支持。如果使用 JSON 对象对计划项进行分组,则会更简单:
{
"day": [
DayScheduleItem1,
DayScheduleItem2
],
"weekday": [
WeekDayScheduleItem1,
WeekDayScheduleItem2
],
...
}
然后,您可以编写一个数据类,该类将所有这些条目作为属性,例如 ,并序列化和反序列化该数据类。val day: List<DayScheduleItem>
评论