3

我为数据类Value下的 json 字段创建了一个密封类。CustomAttribute该字段可以返回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()
}
4

2 回答 2

1

一种解决方案是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 工件公开。

它旨在从此处复制/粘贴到您的项目中

于 2021-08-02T22:36:20.887 回答
0

我过去成功地序列化和反序列化了一个密封类,并声明使用 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 的等效配置,该配置也将在您的序列化数据中包含类标识符。

于 2020-02-17T23:17:53.400 回答