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 { 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 { 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 { 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 { 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 = gson.fromJson(root.get("answers"), object : TypeToken>() {}.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 { 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() {}.type ) ExamType.OQ -> gson.fromJson( json, object : TypeToken() {}.type ) null -> throw NullPointerException("无法识别题目类型!") } } }