基于 属性 值反序列化 json 对象的最佳方法

Best way to deserialize json objects based in property value

我想将 JSON 字符串转换为对象,我正在尝试找到最佳方法,因为这些对象非常相似,唯一的变化是它们之间的“数据”字段:

{
  "event_type": "REGISTER",
  "day": "2021-01-01",
  "data": {
    "name": "Kyore",
    "age": 10
  }
}

{
  "event_type": "DELETE",
  "day": "2021-01-01",
  "data": {
    "id": "1234-1234-1234",
    "reason": "user requested"
  }
}

这些事件作为 JSON 字符串来自 SQS 监听器,我正在尝试找到使用 Kotlin 处理它们的最佳方法,但我不确定如何选择哪个 class 将是我的监听器中要转换的那个:

abstract class Event {
    abstract val event_type: String
    abstract val day: String
    abstract val data: EventData

    abstract class EventData
}

class RegisterEvent(
    override val eventType: String,
    override val day: String,
    override val data: RegisterData
) : Event() {

    data class RegisterData(
        val name: String,
        val age: Int
    ) : Event.EventData()
}

class DeleteEvent(
    override val eventType: String,
    override val day: String,
    override val data: DeleteData
) : Event() {

    data class RegisterData(
        val id: String,
        val reason: String
    ) : Event.EventData()
}

在正确的事件中转换消息字符串的最佳方法是什么?

阅读多态反序列化一段时间后,我找到了一个使用 Kotlin 和 Jackson 的解决方案,基本上我们需要使用来自 jackson 注释的 @JsonTypeInfo 和 @JsonSubTypes 并告诉它 属性 将是哪个检查反序列化,匹配时应使用哪个 Class,使用 OP 示例:

data class Event(
   val event_type: String,
   val day: String,
   val data: EventData
) {

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "event_type", include = JsonTypeInfo.As.EXTERNAL_PROPERTY)
    @JsonSubTypes(value = [
        JsonSubTypes.Type(RegisterData::class, name = "REGISTER"),
        JsonSubTypes.Type(DeleteData::class, name = "DELETE")
    ])
   abstract class EventData
}

data class RegisterData(
    val name: String,
    val age: Int
) : Event.EventData()

data class DeleteData(
    val id: String,
    val reason: String
) : Event.EventData()

因此,当我们将 JSON 字符串转换为 Event 对象时,data 属性 将映射到 RegisterDataDeleteData 类.