You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
4.1 KiB

package com.gyf.csams.util
import com.google.gson.*
import com.google.gson.reflect.TypeToken
import com.gyf.csams.association.model.*
import com.gyf.lib.uikit.StringForm
import java.lang.reflect.Type
class OpenQuestionsVoSerializer : JsonSerializer<OpenQuestionsVo> {
override fun serialize(
vo: OpenQuestionsVo?,
p1: Type?,
p2: JsonSerializationContext?
): JsonElement {
val gson = Gson()
val c = JsonObject()
c.add("examType", gson.toJsonTree(vo?.examType?.name))
// c.add("question", gson.toJsonTree(vo?.question?.formValue?.value))
return c
}
}
class OpenQuestionsVoDeserializer : JsonDeserializer<OpenQuestionsVo> {
override fun deserialize(
json: JsonElement?,
p1: Type?,
p2: JsonDeserializationContext?
): OpenQuestionsVo {
val root = json?.asJsonObject
val value = root?.get("question")?.asString
val question = StringForm(formDesc = "问题", textLength = QUESTION_TEXT_LENGTH)
if (value != null) {
question.onChange(value)
TODO()
// return OpenQuestionsVo(question = question)
} else {
throw NullPointerException("问题无法解析!!!!")
}
}
}
class ChoiceQuestionVoSerializer : JsonSerializer<ChoiceQuestionVo> {
override fun serialize(
vo: ChoiceQuestionVo?,
p1: Type?,
p2: JsonSerializationContext?
): JsonElement {
val gson = Gson()
val c = JsonObject()
c.add("examType", gson.toJsonTree(vo?.examType?.name))
// c.add("question", gson.toJsonTree(vo?.question?.formValue?.value))
// c.add("answers", gson.toJsonTree(vo?.answers))
c.add("rightAnswer", gson.toJsonTree(vo?.rightAnswer))
return c
}
}
class ChoiceQuestionVoDeserializer : JsonDeserializer<ChoiceQuestionVo> {
override fun deserialize(
json: JsonElement?,
p1: Type?,
p2: JsonDeserializationContext?
): ChoiceQuestionVo {
val root = json?.asJsonObject
val value = root?.get("question")?.asString
val question = StringForm(formDesc = "问题", textLength = QUESTION_TEXT_LENGTH)
if (value != null) {
question.onChange(value)
val gson = Gson()
val answers: List<String> =
gson.fromJson(root.get("answers"), object : TypeToken<List<String>>() {}.type)
if (answers.size != ANSWER_SIZE) {
throw IllegalArgumentException("选项数量!=$QUESTION_TEXT_LENGTH")
}
val rightAnswer = root.get("rightAnswer").asInt
TODO()
// return ChoiceQuestionVo(
// question = question,
// answers = answers.map {
// StringForm(
// formDesc = "选项",
// textLength = ANSWER_TEXT_LENGTH,
// value = it
// )
// },
// rightAnswer = rightAnswer
// )
} else {
throw NullPointerException("问题无法解析!!!!")
}
}
}
/**
* 题目反序列化
*
*/
class ExamDeserializer : JsonDeserializer<Exam> {
companion object {
val gson: Gson = GsonBuilder()
.registerTypeAdapter(OpenQuestionsVo::class.java, OpenQuestionsVoDeserializer())
.registerTypeAdapter(ChoiceQuestionVo::class.java, ChoiceQuestionVoDeserializer())
.create()
}
override fun deserialize(json: JsonElement?, p1: Type?, p2: JsonDeserializationContext?): Exam {
val root = json?.asJsonObject
val type = root?.get("examType")?.asString
return when (gson.fromJson(type, ExamType::class.java)) {
ExamType.CQ -> gson.fromJson(
json,
object : TypeToken<ChoiceQuestionVo>() {}.type
)
ExamType.OQ -> gson.fromJson(
json,
object : TypeToken<OpenQuestionsVo>() {}.type
)
null -> throw NullPointerException("无法识别题目类型!")
}
}
}