Erstellen Sie diesen Inline-Spaß:
inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)
und dann können Sie es so nennen:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Bisherige Alternativen:
ALTERNATIVE 1:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Sie müssen eingeben object :
und den spezifischen Typ eingebenfromJson<List<Turns>>
ALTERNATIVE 2:
Wie @cypressious erwähnt, kann dies auch auf folgende Weise erreicht werden:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
benutzen als:
val turnsType = genericType<List<Turns>>()
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Dies löst das Problem:
Die erste Zeile erstellt einen Objektausdruck , der von diesem abstammt
TypeToken
und dann JavaType
abruft. Dann benötigt dieGson().fromJson
Methode entweder den für das Ergebnis der Funktion angegebenen Typ (der mit demTypeToken
erstellten übereinstimmen sollte ). Zwei Versionen dieser Arbeit, wie oben oder:Um das Erstellen der zu vereinfachen,
TypeToken
können Sie eine Hilfsfunktion erstellen, die inline sein muss, damit sie Parameter mit geändertem Typ verwenden kann :Was dann auf eine der folgenden Arten verwendet werden kann:
Und der gesamte Prozess kann in eine Erweiterungsfunktion für die
Gson
Instanz eingebunden werden :Damit Sie einfach Gson anrufen können und sich überhaupt keine Sorgen machen müssen
TypeToken
:Hier verwendet Kotlin die Typinferenz von der einen oder der anderen Seite der Zuweisung und reifizierte Generika für eine Inline-Funktion, um den vollständigen Typ (ohne Löschung) zu durchlaufen, und verwendet diese, um einen zu konstruieren
TypeToken
und auch Gson aufzurufenquelle
Gson().fromJson<kotlin.List<Turns>>(pref.turns)
Gson()
oder nur so,Gson
als ob sie statisch wäre? Sie benötigen die erste, eine Instanz.Eine andere Option (nicht sicher, ob sie eleganter aussieht als die anderen) könnte ein Anruf wie dieser sein:
Sie verwenden also den Java Array Class One Liner anstelle von "pure Kotlin".
quelle
Es ist meine Art, Datenarrays in Kotlin zu analysieren.
quelle
Ich habe so etwas verwendet, um
T
zustring
&String
zurück zuT
verwendenGson
. Nicht genau das, wonach Sie suchen, aber nur für den Fall.quelle
Dies funktioniert auch und ist einfacher
quelle
Kotlin
generic reified function
von Gson deserialisiert,ArrayList<T>
um diesen Code zu verwendenquelle