在Kotlin中使用Gson序列化数据类中的Sealed类

cczfrluj  于 2022-11-06  发布在  Kotlin
关注(0)|答案(2)|浏览(288)

我已经为CustomAttribute数据类下的json字段Value创建了一个密封类,这个字段可以返回StringArray of Strings
我们如何从json中反序列化这个密封类?

data class CustomAttribute (
     val attributeCode: String,
     val value: Value 
)

sealed class Value {
      class StringArrayValue(val value: List<String>) : Value()
      class StringValue(val value: String)            : Value()
}
0lvr5msh

0lvr5msh1#

一种解决方案是按照this answer中的说明使用RuntimeTypeAdapterFactory

val valueTypeAdapter = RuntimeTypeAdapter.of(Value::class.java)
    .registerSubtype(StringArrayValue::class.java)
    .registerSubtype(StringValue::class.java)
val gson = GsonBuilder().registerTypeAdapter(valueTypeAdapter).create()

RuntimeTypeAdapter包含在Gson的源代码中,但未公开为Maven工件。
它被设计为复制/粘贴到您的项目from here

l5tcr1uw

l5tcr1uw2#

过去我已经成功地序列化和反序列化了一个密封类,并声明使用Jackson而不是Gson作为我的序列化引擎。
我的密封类已经定义为:

@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, visible = true)
sealed class FlexibleResponseModel
    class SnapshotResponse(val collection: List<EntityModel>): FlexibleResponseModel()
    class DifferentialResponse(val collection: List<EntityModel>): FlexibleResponseModel()
    class EventDrivenResponse(val collection: List<EntityEventModel>): FlexibleResponseModel()
    class ErrorResponse(val error: String): FlexibleResponseModel()

通过使用注解,假定通信的双方都拥有密封类的统一定义,则Jackson示例不需要进一步配置就可以正确地序列化和反序列化该密封类的示例。
虽然我认识到JsonTypeInfo是一个特定于Jackson的注解,但如果必须使用Gson特性,也许您可以考虑从Gson转换过来-或者您可以找到一个等效的Gson配置,它也可以在序列化数据中包含类标识符。

相关问题