Обработка нескольких Json типов объектов с помощью Retrofit2 Kotlin - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу получить данные объекта с несколькими моделями с динамическим типом, я пытаюсь с этим потоком обрабатывать несколько 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...