Créez ce plaisir en ligne:
inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)
et ensuite vous pouvez l'appeler de cette façon:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Alternatives précédentes:
ALTERNATIVE 1:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Vous devez mettre object :
et le type spécifique dansfromJson<List<Turns>>
ALTERNATIVE 2:
Comme @cypressious le mentionne, cela peut également être réalisé de cette manière:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
utilisé comme:
val turnsType = genericType<List<Turns>>()
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Cela résout le problème:
La première ligne crée une expression d'objet qui descend de
TypeToken
puis obtient le Java àType
partir de cela. Ensuite, laGson().fromJson
méthode a besoin du type spécifié pour le résultat de la fonction (qui doit correspondre à celuiTypeToken
créé). Deux versions de ce travail, comme ci-dessus ou:Pour faciliter la création du,
TypeToken
vous pouvez créer une fonction d'assistance, qui doit être en ligne pour pouvoir utiliser des paramètres de type réifiés :Qui peut ensuite être utilisé de l'une de ces manières:
Et l'ensemble du processus peut être enveloppé dans une fonction d'extension pour l'
Gson
instance:Pour que vous puissiez simplement appeler Gson et ne pas vous inquiéter du
TypeToken
tout:Ici, Kotlin utilise l'inférence de type d'un côté de l'affectation ou de l'autre, et des génériques réifiés pour qu'une fonction en ligne passe par le type complet (sans effacement), et l'utilise pour construire un
TypeToken
et également faire l'appel à Gsonla source
Gson().fromJson<kotlin.List<Turns>>(pref.turns)
Gson()
ou simplementGson
comme si elle était statique? Vous avez besoin du premier, une instance.Une autre option (pas sûr qu'elle ait l'air plus élégante que les autres) pourrait être un appel comme celui-ci:
Vous utilisez donc la doublure java Array class one au lieu de "pure Kotlin".
la source
C'est ma façon d'analyser le tableau de données dans kotlin.
la source
J'ai utilisé quelque chose comme ça pour convertir
T
àstring
etString
revenir à l'T
utilisationGson
. Pas exactement ce que vous recherchez mais juste au cas où.la source
Cela fonctionne également et est plus simple
la source
Kotlin
generic reified function
de Gson désérialise pourArrayList<T>
utiliser ce codela source