Создайте это встроенное развлечение:
inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)
а затем вы можете назвать это так:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Предыдущие альтернативы:
АЛЬТЕРНАТИВА 1:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Вы должны указать object :
и конкретный тип вfromJson<List<Turns>>
АЛЬТЕРНАТИВА 2:
Как упоминает @cypressious, это также может быть достигнуто таким образом:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
использовать как:
val turnsType = genericType<List<Turns>>()
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Это решает проблему:
Первая строка создает объектное выражение, которое происходит от него,
TypeToken
а затем получает от него JavaType
. ЗатемGson().fromJson
методу либо нужен тип, указанный для результата функции (который должен совпадать сTypeToken
созданным). Две версии этой работы, как указано выше или:Чтобы упростить создание,
TypeToken
вы можете создать вспомогательную функцию, которая должна быть встроенной, чтобы она могла использовать параметры повторного типа :Что затем можно использовать одним из следующих способов:
И весь процесс можно обернуть в функцию расширения для
Gson
экземпляра:Так что вы можете просто позвонить Gson и совсем не беспокоиться о
TypeToken
:Здесь Kotlin использует вывод типа с одной стороны присваивания или другой, и повторно использует универсальные шаблоны для встроенной функции, чтобы пройти через полный тип (без стирания), и использовать это для создания,
TypeToken
а также для вызова Gsonисточник
Gson().fromJson<kotlin.List<Turns>>(pref.turns)
Gson()
или простоGson
статичный? Вам нужен первый экземпляр.Другой вариант (не уверен, что он выглядит более элегантно, чем другие) может заключаться в следующем:
Итак, вы используете один лайнер класса java Array вместо «чистого Kotlin».
источник
Это мой способ разбора массива данных в котлине.
источник
Я что - то вроде этого , чтобы преобразовать
T
вstring
иString
обратно ,T
используяGson
. Не совсем то, что вы ищете, но на всякий случай.источник
Это тоже работает, но проще
источник
Kotlin
generic reified function
of Gson десериализует, чтобыArrayList<T>
использовать этот кодисточник