Utwórz tę wbudowaną zabawę:
inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)
a potem możesz to nazwać w ten sposób:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Poprzednie alternatywy:
ALTERNATYWA 1:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Musisz umieścić object :
i konkretny typfromJson<List<Turns>>
ALTERNATYWA 2:
Jak wspomina @cypressious, można to osiągnąć również w ten sposób:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Użyj jako:
val turnsType = genericType<List<Turns>>()
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
To rozwiązuje problem:
Pierwsza linia tworzy wyrażenie obiektowe, które pochodzi od,
TypeToken
a następnie pobiera z niego JavęType
. NastępnieGson().fromJson
metoda wymaga albo typu określonego dla wyniku funkcji (który powinien pasować doTypeToken
utworzonej). Dwie wersje tej pracy, jak wyżej lub:Aby ułatwić tworzenie
TypeToken
, możesz utworzyć funkcję pomocniczą, która musi być wbudowana, aby mogła używać parametrów typu reified :Które można następnie wykorzystać na jeden z następujących sposobów:
Cały proces można opakować w funkcję rozszerzającą dla
Gson
instancji:Abyś mógł po prostu zadzwonić do Gson i wcale się nie martwić
TypeToken
:Tutaj Kotlin używa wnioskowania o typie z jednej lub drugiej strony przypisania i reified generics dla funkcji inline, która przechodzi przez pełny typ (bez wymazywania) i używa tego do skonstruowania a,
TypeToken
a także wywołania Gsonźródło
Gson().fromJson<kotlin.List<Turns>>(pref.turns)
Gson()
czy po prostuGson
tak jakby była statyczna? Potrzebujesz pierwszej instancji.Inną opcją (nie jestem pewien, czy wygląda bardziej elegancko niż inne) może być takie połączenie:
Więc używasz java Array class one liner zamiast "czystego Kotlin".
źródło
To mój sposób na parsowanie tablicy danych w kotlin.
źródło
Kiedyś coś takiego do konwersji
T
dostring
iString
z powrotem doT
korzystaniaGson
. Nie do końca to, czego szukasz, ale na wszelki wypadek.źródło
To również działa i jest prostsze
źródło
Kotlin
generic reified function
z Gson deserializacji, abyArrayList<T>
użyć tego koduźródło