Не удаётся десериализация json при помощи Gson в универсальный тип
У меня есть метод который отправляет запрос на 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)
Как можно решить данную проблему, уже несколько дней мучаюсь с ней и без результата