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

Parse a list of list of different classes using GSON

提问人:msc87 提问时间:2/10/2023 最后编辑:msc87 更新时间:2/13/2023 访问量:46

问:

我需要将我的计划存储在单个 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?
  2. 我需要简化我的课程吗?
  3. 我需要使用其他像 Moshi 这样的库吗?
  4. 我应该更改 JSON 的结构吗?
Android JSON Kotlin 解析 gson

评论


答:

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>