В вашей реализации есть некоторые проблемы и несоответствия.Сначала вы должны убедиться, что десериализованы ObjectType<T>
.Таким образом, вы должны объявить класс как:
class ObjectDeserializer<T> : JsonDeserializer<ObjectType<T>>
Также было бы проще предположить, что все параметры не равны нулю:
override fun deserialize(json: JsonElement, typeOfT: Type,
context: JsonDeserializationContext): ObjectType<T>
Теперь вы можете использовать typeOfT
, которыйна самом деле тип T
в JsonDeserializer
, а не в ObjectDeserializer
.Поэтому это тип ObjectType<T>
, который нужно десериализовать.Чтобы перейти к следующему шагу, вам нужно найти фактический тип T:
val objectTypeType = typeOfT as ParameterizedType
val actualTypeOfT = objectTypeType.getActualTypeArguments()[0]
. В качестве следующего шага вам нужно выяснить содержание json
.В вашем случае вы никогда не найдете массив, кроме объекта или long:
return if (json.isJsonObject()) {
val struct: T = context.deserialize(json, actualTypeOfT)
ObjectType(expand = struct)
} else {
val id = json.getAsLong()
ObjectType(Id = id)
}
Здесь вы возвращаете ObjectType
экземпляров без какой-либо обработки ошибок, которые, возможно, вам также понадобится добавить.
Затем вы должны предоставить этот десериализатор для Gson по:
registerTypeAdapter(ObjectType::class.java, ObjectDeserializer<Any>())
Всякий раз, когда Gson необходимо десериализовать ObjectType<TheType>
, он находитэкземпляр ObjectDeserializer
и обеспечивает ObjectType<TheType>
как typeOfT
до deserialize
.