Kotlin 在 Jackson 中密封了类子类型

标签 kotlin jackson polymorphism subtyping sealed-class

我有以下类(class):

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes(
    JsonSubTypes.Type(value = Speech::class, name = "Speech"),
    JsonSubTypes.Type(value = Audio::class, name = "Audio"),
)
sealed class AudioItem

data class Speech(val type: String = "Speech", val contentType: String = "SSML", val content: String) : AudioItem()
data class Audio(val type: String = "Audio", val source: String) : AudioItem()

当我尝试转换通用 ArrayList 时:

ArrayList with items as LinkedHashMaps

AudioItem

val audio: List<AudioItem> = ObjectMapper().findAndRegisterModules().convertValue(a)

我得到:

Cannot construct instance of AudioItem (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

最佳答案

当您使用密封类 AudioItem() 时它应该可以工作(注意“()”)。 IntelliJ 提示我们可以删除“()”,但如果我这样做,那么我在“结构”选项卡中看不到任何构造函数。

此外,您不需要像 val type: String = "Speech" 中那样显式设置类型。 @JsonSubTypes 将为您完成此操作。

关于Kotlin 在 Jackson 中密封了类子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68938577/

相关文章:

java - 如何通过espresso UI测试初始化​​presenter的可为空变量以避免NPE

android - 从项目目录读取本地文件 | Kotlin 多平台移动 |知识管理系统

java - 我应该在 HTTPClass 中的哪里实现这个 Jackson Root Element 代码?

Java 对象使用 Jackson 将列表扩展为 Json

C++ 类方法,返回 vector<subclass>

opengl - 为什么要绑定(bind)OpenGL缓冲区对象?

java - Kotlin 方法重载

json - Spring 启动( jackson ): How to avoid class name being serialized to JSON

java - 没有继承的子类型和没有子类型的继承?

ruby-on-rails - Rails 多态命名边缘情况