Я хочу получить данные объекта с несколькими моделями с динамическим типом, я пытаюсь с этим потоком обрабатывать несколько JSON типов объектов в массиве JSON, используя Retrofit2 , но я путаюсь, потому что мой тип объекта всегда получить нулевое значение.
это мой ответ
{
"diagnostic": {
"code": 200,
"status": "Sukses"
},
"response": [
{
"id": "9054efc0-7d30-11ea-a2a7-bd48906ea511",
"uuid_course": "1cb47360-7d30-11ea-bde8-d950c9f4f6ce",
"title_section": "Golang introduction",
"sub_section": [
{
"id": 5,
"title": "pengenalan golang",
"type": "html",
"materi": {
"id": 1,
"html": "<b>halo</b>",
"title": "What is about golang ?"
}
},
{
"id": 6,
"title": "Pengenalan Golang",
"type": "pdf",
"materi": {
"id": 3,
"pdf": "http://ec2-18-222-242-168.us-east-2.compute.amazonaws.com:8069/uploads/pdf/1586746220.pdf",
"title": "Golang",
"description": "ini adalah materi awal dari golang"
}
},
{
"id": 7,
"title": "golang introduction",
"type": "video",
"materi": {
"id": 3,
"video": [
{
"ukuran": "360P",
"link": "U2FsdGVkX19Y0fEZJI4rn4SOKVcoweBB6/KzK7hOQzyifObWq0eSxmBq53bCLDhjSiaWwej/vk1BX0++QASdOQJpJPiwcsjDFlpok9lPQegyH6VjTrQlnqkIIvzfCkmejruZ1jiXnqLl7gbOXbatHkybcPbGbxHNHDRw/Y4qXX8IvI08f4X6FkiFBF/+R2j+gItCxr6ie/+f1XIK9AE+sPF7NUOH2ACoMtUF4pGAqSxx6BQMI8wa59HhvSFESdUUM4JIJauJKhcFXX/JNEuWxH+PpL+0L1PKGjSGXGbABnMi5uSnwyyeBVQKoY+t3l5AF9kQg3PmVWlRRYKn9QrP7evn+lBW6OflfimbKWJ4+8ZETBXf5zF6/lSIYinjQ1ogOdmCGbSVymjGbvt/vuUxCRUsaf1f0KdVIrwBQS1HTunm06kGPGkp9WGkp8Gq8wvrPi50HLsNhe0JVuRKQZ4pq9JqImw5Rp0lxkgzmCo782kkja3XkARlFZg20HMMR++ZmNmb6DX5031M83pTl9DgD2XndUxSgMz5rM6o/foxPvE5+DxFhOljbn1m8l4xil5HOTdQpMGf/pTMNbPUBZYpXoGtjnXrZSngM7LjQtyHqksW1EV2On4nqXQpTkTGIWPaSW4qI29tDsvWfMBljzrG5P5JEVemWI0MBtG9YKxkqvaVQZtT2IsoIaOzXj58NiR6gBw6sB+DT1tb3GMz0z0rt20t5DV6gErelfWwEL2IDjMqLVl4RuNeAl6AeIHht07Nyy+Ojrj4uiQPoKJnqrdKYtz4+EA9EUpCQnEl8F5ZyY55hdhzVMrLMb7gXDYhnXFcwwmpAUP1zKh5Sgk27djfTLuVGLupr03OShDswHzu7/FP+ECyBG4DNZ91hyjci3jIoXU2bdbpGmmRRth2lS77R6AThHtEYX2kbHVspEySC7U/VRdaXf4M5TP/Z42sQiAzbxLN8wQn/lNsoikrKswBQx0F1H9sbOJMhY1ldjWKMFvVtZDZ4t43UMuLD4EGqSBhHWodu/qfkBJfFum78wxJq2Sg9zbB9fDM+MUyzPRWWtPO6t9sgU3Igb5GDD3zgjGc0izQhHbKJkCi4z/RfPwUgw=="
}
],
"title": "introduction golang",
"desc": "pengertian golang"
}
},
{
"id": 8,
"title": "Ujian Introduction",
"type": "exam",
"materi": {
"id": 1,
"soal": "Pilih Lah Jawaban A",
"jawaban": "a",
"A": "ini A",
"B": "ini B",
"C": "ini C",
"D": "ini D",
"E": "ini E"
}
}
],
"created_at": "2020-04-13T02:43:32.000000Z",
"updated_at": "2020-04-13T02:43:32.000000Z"
}
]}
, и у меня есть такие данные модели
data class ModelResponseMateri(
@SerializedName("diagnostic")
var diagnostic: ModelDiagnostic? = null,
@SerializedName("response")
var response: ArrayList<ModelMateri?>? = null
)
data class ModelMateri(
@SerializedName("uuid_course")
var uuid_course: String? = "",
@SerializedName("title_section")
var title_section: String? = "",
@SerializedName("sub_section")
var sub_section: ArrayList<ModelSubSectionMateri?>? = null
)
data class ModelSubSectionMateri(
@SerializedName("id")
var id: Int? = 0,
@SerializedName("title")
var title: String? = "",
@SerializedName("type")
var type: SuperItem.Type? = null
)
десерилизатор класса
class TypeDeserializer : JsonDeserializer<SuperItem?> {
override fun deserialize(
json: JsonElement?,
typeOfT: Type?,
context: JsonDeserializationContext?
): SuperItem? {
val gson = Gson()
var item: SuperItem? = null
val rootObject = json?.asJsonObject!!
Log.d("lapar root", "$rootObject")
val typeString = rootObject["type"].asString
Log.d("lapar string", "$typeString")
val type: SuperItem.Type = SuperItem.Type.fromString(typeString)!!
Log.d("lapar type", "$type")
when (type) {
SuperItem.Type.TYPE_EXAM -> item = gson.fromJson(json, ModelTypeExam::class.java)
SuperItem.Type.TYPE_VIDEO -> item = gson.fromJson(json, ModelTypeVideo::class.java)
SuperItem.Type.TYPE_HTML -> item = gson.fromJson(json, ModelTypeHTML::class.java)
SuperItem.Type.TYPE_PDF -> item = gson.fromJson(json, ModelTypePDF::class.java)
else -> Log.d("TAG", "Invalid type: $typeString")
}
return item
}
}
суперэлемент класса
abstract class SuperItem {
enum class Type(var value: String) {
@SerializedName("materi")
TYPE_HTML("html"),
@SerializedName("materi")
TYPE_PDF("pdf"),
@SerializedName("materi")
TYPE_EXAM("exam"),
@SerializedName("materi")
TYPE_VIDEO("video");
companion object {
fun fromString(i: String): Type? {
return when (i) {
"html" -> TYPE_HTML
"pdf" -> TYPE_PDF
"exam" -> TYPE_EXAM
"video" -> TYPE_VIDEO
else -> {
Log.d("SuperItem", "No existing type for integer: $i")
null
}
}
}
}
init {
this.value = value
}
}
@SerializedName("type")
val type : Type? = null
}
data class ModelTypeVideo(
@SerializedName("id")
var id: Int? = 0,
@SerializedName("video")
var video: ArrayList<ModelVideo?>? = null,
@SerializedName("title")
var title: String? = "",
@SerializedName("desc")
var desc: String? = ""
): SuperItem()
data class ModelTypeExam(
@SerializedName("id")
var id: Int? = 0,
@SerializedName("video")
var video: ArrayList<ModelVideo?>? = null,
@SerializedName("title")
var title: String? = "",
@SerializedName("desc")
var desc: String? = ""
): SuperItem()
data class ModelTypeHTML(
@SerializedName("id")
var id: Int? = 0,
@SerializedName("html")
var html: String? = "",
@SerializedName("title")
var title: String? = ""
): SuperItem()
data class ModelTypePDF(
@SerializedName("id")
var id: Int? = 0,
@SerializedName("pdf")
var pdf: String? = "",
@SerializedName("title")
var title: String? = "",
@SerializedName("description")
var description: String? = ""
): SuperItem()