Десериализация общего типа с GSON - PullRequest
0 голосов
/ 12 апреля 2019

Я уже видел этот вопрос:

Десериализация общих типов с GSON

, но мой вариант использования другой, мне нужно просто преобразовать json в T, а не List<T> или подобное ... Вот что мне нужно в коде:

 val type: Type = object : TypeToken<T>() {}.type

, а затем

Gson().fromJson<T>(json, type)

Но это не работает. Он возвращает LinkedHashMap или что-то в этом роде, но не класс, представленный T. Когда я заменяю T фактическим типом класса, он работает, но с T он не работает. Может ли кто-нибудь дать мне совет? Спасибо

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Просто используйте Gson().fromJson(json, T.class); Не требуется TypeToken

0 голосов
/ 12 апреля 2019

Я нашел решение: Использование только T::class.java было недостаточно, это дало мне ошибку компиляции:

Невозможно использовать T в качестве параметра типа reified. Вместо этого используйте класс

Так что мне пришлось искать решение, как это исправить. Мне нужно было изменить имя функции следующим образом:

fun <T> myFunction

к этому:

inline fun <reified T> myFunction

после этого ошибка компиляции не отображается и код работает больше информации об этой теме здесь: Создание универсального массива в Kotlin

и десериализация выглядит так:

 Gson().fromJson(json, T::class.java)
...