Crie esta diversão inline:
inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)
e então você pode chamá-lo desta forma:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Alternativas anteriores:
ALTERNATIVA 1:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Você tem que colocar object :
e o tipo específico emfromJson<List<Turns>>
ALTERNATIVA 2:
Como menção @cypressious, também pode ser alcançado desta forma:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
usar como:
val turnsType = genericType<List<Turns>>()
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Isso resolve o problema:
A primeira linha cria uma expressão de objeto que desce
TypeToken
e obtém o Java aType
partir dela . Então, oGson().fromJson
método precisa do tipo especificado para o resultado da função (que deve corresponder aoTypeToken
criado). Duas versões deste trabalho, como acima ou:Para facilitar a criação de,
TypeToken
você pode criar uma função auxiliar, que deve estar embutida para que possa usar parâmetros de tipo reificado :Que pode então ser usado de uma destas maneiras:
E todo o processo pode ser envolvido em uma função de extensão para a
Gson
instância:Para que você possa apenas ligar para Gson e não se preocupar com
TypeToken
nada:Aqui, Kotlin está usando inferência de tipo de um lado da atribuição ou do outro, e genéricos reificados para que uma função inline passe pelo tipo completo (sem apagamento) e usando isso para construir um
TypeToken
e também fazer a chamada para Gsonfonte
Gson().fromJson<kotlin.List<Turns>>(pref.turns)
Gson()
ou apenasGson
como se fosse estático? Você precisa do primeiro, uma instância.Outra opção (não tenho certeza se parece mais elegante do que as outras) pode ser uma chamada como esta:
Portanto, você está usando o liner de classe um do java Array em vez de "Kotlin puro".
fonte
É a minha maneira de analisar o array de dados em kotlin.
fonte
Eu usei algo como isto para converter
T
parastring
eString
volta aT
utilizarGson
. Não exatamente o que você está procurando, mas apenas no caso.fonte
Isso também funciona e é mais simples
fonte
Kotlin
generic reified function
de Gson desserializa paraArrayList<T>
usar este códigofonte