GSON, настраиваемый десериализатор для нескольких классов - PullRequest
0 голосов
/ 19 марта 2019

Мне нужно реализовать собственный десериализатор GSON (с Retrofit2) для моего приложения Android в kotlin.Вот как пример того, как API дает мне результат:

example1:

 {
     "res": {
          "status": {
              "code": 0,
              "message": "some message",
          }
     },
     "somedata": {
         "someid" = "12345",
         "sometext" = "a text" 
     }
 }

example2:

{
     "res": {
          "status": {
              "code": 0,
              "message": "another message",
          }
     },
     "anotherdata": {
         "anotherid" = "54321",
         "anothertext" = "b text" 
     }
 }

это относительные классы kotlin для отображения данных (ябудет использовать десериализатор для извлечения данных внутри объекта "res"):

abstract class GenericResponse() {
    //abstract class for common fields
    constructor(status: Status?) : this()
}

class Status(
    val code: Int,
    val message: String
)

, и это конкретные классы ответа:

data class SomeData(
    val status: Status,
    val someid : String,
    val sometext : String
): GenericResponse(status)


data class AnotherData(
    val status: Status,
    val anotherid : String,
    val anothertext : String
): GenericResponse(status)

Я попытался создать собственный класс десериализатора, который реализуетJsonDeserializer, что-то вроде:

class CustomDeserializer : JsonDeserializer<GenericResponse> {
    override fun deserialize(
        json: JsonElement?,
        typeOfT: Type?,
        context: JsonDeserializationContext?
    ): GenericResponse {

    val rootElement = json!!.asJsonObject.getAsJsonObject("res")
    //further implementation, should return SomeData or AnotherData object
}

, но это не работает.Как я могу это сделать?

1 Ответ

0 голосов
/ 19 марта 2019

Для вашего ответа JSON

{
"res": {
    "status": {
        "code": 0,
        "message": "some message"
    }
},
"somedata": {
    "someid": "12345",
    "sometext": "a text"
},
"anotherdata": {
    "anotherid": "54321",
    "anothertext": "b text"
}
}

Классами модели данных могут быть Somedata

data class Somedata(
val someid: String,
val sometext: String
)

Status

data class Status(
val code: Int,
val message: String
)

Anotherdata

data class Anotherdata(
val anotherid: String,
val anothertext: String
)

Эти классы можно комбинировать для анализа всего ответа. GenericResponse

data class GenericResponse(
val anotherdata: Anotherdata,
val res: Res,
val somedata: Somedata
)

При использовании для модернизации, например

@POST("url")
fun callingMethod(@Field("username") username: String, @Field("password") 
password: String): GenericResponse
...