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

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

我有一个服务器响应,它可以返回一个字符串数组,或者一个对象数组,但是我不知道如何定义这种多态关系。下面是序列化器的Kotlin代码。sentence类需要是一个普通数组,但是序列化器需要一个val键。

  1. @Serializable
  2. data class QuizResponse(
  3. val name: String,
  4. val quiz: List<Quiz>
  5. )
  6. @Serializable
  7. data class Quiz(
  8. val id: Int,
  9. val question: String,
  10. val quiz_type: String,
  11. val video: BasicVideo,
  12. val answers: List<Answer>
  13. )
  14. @Polymorphic
  15. @Serializable
  16. sealed class Answer {
  17. @Serializable
  18. data class Sentence(val answer: List<String>) : Answer()
  19. @Serializable
  20. data class Choice(val answer: String, val id: Int, val is_correct: Boolean) : Answer()
  21. }

字符串
下面是两个示例响应:

  1. {
  2. "name":"STRING",
  3. "quiz":[
  4. {
  5. "id":123,
  6. "video":{
  7. "id":12,
  8. "name":"ABC"
  9. },
  10. "question": "Question text",
  11. "answers": ["a","b","c","d","e","f"],
  12. "quiz_type":"sentence"
  13. }
  14. ]
  15. }
  16. {
  17. "name":"STRING",
  18. "quiz":[
  19. {
  20. "id":123,
  21. "video":{
  22. "id":12,
  23. "name":"ABC"
  24. },
  25. "question": "Question text",
  26. "answers": [
  27. {
  28. "id": 12,
  29. "text": "abc",
  30. "is_correct": false,
  31. },
  32. {
  33. "id": 13,
  34. "text": "abc",
  35. "is_correct": true,
  36. },
  37. ],
  38. "quiz_type":"choice"
  39. }
  40. ]
  41. }


answers键可以是字符串数组或对象数组。这取决于quiz_type键。
为这些数据创建自定义序列化程序的正确方法是什么?

iibxawm4

iibxawm41#

我知道这是一个相当过时的,但对于一个人谁仍然在寻找答案:
您可以使用quiz_type作为多态路由器。您可以在这里和这里了解它。
解决方案应该类似于以下内容:

  1. @JsonClassDiscriminator("quiz_type")
  2. sealed interface Quiz {
  3. @SerialName("sentence") // value of the discriminator
  4. data class Sentence(
  5. ...
  6. answers: List<String>
  7. )
  8. @SerialName("choice") // value of the discriminator
  9. data class Choice(
  10. ...
  11. answers: List<Answer>
  12. ) {
  13. data class Answer(...)
  14. }
  15. }

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

展开查看全部

相关问题