Не удаётся десериализация json при помощи Gson в универсальный тип

Рейтинг: 0Ответов: 0Опубликовано: 26.01.2023

У меня есть метод который отправляет запрос на WebSocket и получает ответ. Ответ в виде json, есть общая модель (WsResponseBase) для всех методов API и меняется только модель Value в зависимости от вызванного метода (GetCompanyResponse)

{
  "Class": "CompanyWsController",
  "Method": "GetCompany ",
  "Value": {
    "Id": 1,
    "Name": "Name",
    "LogoUrl": "LogoUrl",
    "Phone": "Phone",
    "City": "City",
    "Street": "Street"
  },
  "ErrorCode": 0,
  "IsSuccess": true
}

Я пытаюсь его десериализация при помощи Gson и у меня это успешно получается, при помощи такого кода

fun <Treq, Tres : Any> send(controller: String, method: String, request: Treq): Tres? {
        val gson = Gson()

        // ...
        // код отправки запроса / получения ответа
        // ...
        
        val modelType = object : TypeToken<WsResponseBase<Tres?>?>() {}.type
        var response = gson.fromJson<WsResponseBase<Tres?>?>(responseJson, modelType)

        return response.valueData
    }

Но есть одно но, модель valueData типа LinkedTreeMap, а не того что я передавал в метод GetCompanyResponse

введите сюда описание изображения

Если передавать напрямую модель GetCompanyResponse вместо TRes, то всё успешно работает, но мне именно нужно универсальный тип, что бы при помощи одного метода отправлять и получать ответ с API

Модель WsRequestBase

class WsRequestBase<TValue> {
    @SerializedName("Controller")
    var controller: String
    @SerializedName("Method")
    var method: String
    @SerializedName("Value")
    var valueData: TValue
}

Модель GetCompanyResponse

class GetCompanyResponse {
    @SerializedName("Id")
    var id: Int = 0
    @SerializedName("Name")
    lateinit var name: String
    @SerializedName("LogoUrl")
    lateinit var logoUrl: String
    @SerializedName("Phone")
    lateinit var phone: String
    @SerializedName("City")
    lateinit var city: String
    @SerializedName("Street")
    lateinit var street: String
}

Так вызываю метод

wsClient.send<GetCompanyRequest, GetCompanyResponse>("CompanyWsController", "GetCompany", request)

Как можно решить данную проблему, уже несколько дней мучаюсь с ней и без результата

Ответы

Ответов пока нет.