0

我有以下课程:

@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 项目为 LinkedHashMaps

AudioItem

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

我得到:

无法构造实例AudioItem(没有创建者,如默认构造函数,不存在):抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么包含额外的类型信息

4

1 回答 1

2

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

此外,您不需要像在val type: String = "Speech". @JsonSubTypes会为你做的。

于 2021-08-31T09:03:13.400 回答