我有一个服务器响应,可以返回字符串数组或对象数组,但我不知道如何定义这种多态关系。以下是序列化器的 Kotlin 代码。
sentence
类需要是一个普通数组,但序列化器需要一个 val
键。
@Serializable
data class QuizResponse(
val name: String,
val quiz: List<Quiz>
)
@Serializable
data class Quiz(
val id: Int,
val question: String,
val quiz_type: String,
val video: BasicVideo,
val answers: List<Answer>
)
@Polymorphic
@Serializable
sealed class Answer {
@Serializable
data class Sentence(val answer: List<String>) : Answer()
@Serializable
data class Choice(val answer: String, val id: Int, val is_correct: Boolean) : Answer()
}
以下是两个示例响应:
{
"name":"STRING",
"quiz":[
{
"id":123,
"video":{
"id":12,
"name":"ABC"
},
"question": "Question text",
"answers": ["a","b","c","d","e","f"],
"quiz_type":"sentence"
}
]
}
{
"name":"STRING",
"quiz":[
{
"id":123,
"video":{
"id":12,
"name":"ABC"
},
"question": "Question text",
"answers": [
{
"id": 12,
"text": "abc",
"is_correct": false,
},
{
"id": 13,
"text": "abc",
"is_correct": true,
},
],
"quiz_type":"choice"
}
]
}
answers
键可以是字符串数组或对象数组。这取决于 quiz_type
键。
为此数据创建自定义序列化器的正确方法是什么?
我知道这个已经过时了,但对于仍在寻找答案的人来说:
您可以使用
quiz_type
作为多态鉴别器。您可以了解它这里和这里。
解决方案应类似于以下内容:
@JsonClassDiscriminator("quiz_type")
sealed interface Quiz {
@SerialName("sentence") // value of the discriminator
data class Sentence(
...
answers: List<String>
)
@SerialName("choice") // value of the discriminator
data class Choice(
...
answers: List<Answer>
) {
data class Answer(...)
}
}