Kotlin多态序列化(字符串数组和对象数组)

vojdkbi0  于 2023-11-21  发布在  Kotlin
关注(0)|答案(1)|浏览(240)

我有一个服务器响应,它可以返回一个字符串数组,或者一个对象数组,但是我不知道如何定义这种多态关系。下面是序列化器的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键。
为这些数据创建自定义序列化程序的正确方法是什么?

iibxawm4

iibxawm41#

我知道这是一个相当过时的,但对于一个人谁仍然在寻找答案:
您可以使用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(...)
    }
}

字符串
如果在所有模型中没有一个序列化字段,可以在运行时使用JsonContentPolymorphicSerializer基于JSON内容选择一个序列化器

相关问题