基于 属性 值反序列化 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
属性 将映射到 RegisterData
和 DeleteData
类.
我想将 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
属性 将映射到 RegisterData
和 DeleteData
类.