Crea esta diversión en línea:
inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)
y luego puedes llamarlo de esta manera:
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)
Tienes que poner object :y el tipo específico enfromJson<List<Turns>>
ALTERNATIVA 2:
Como mencionan @cypressious, también se puede lograr de esta manera:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
usar como:
val turnsType = genericType<List<Turns>>()
inline fun <reified T> genericType() = object: TypeToken<T>() {}.typeEsto resuelve el problema:
La primera línea crea una expresión de objeto que desciende
TypeTokeny luego obtiene JavaTypede eso. Entonces elGson().fromJsonmétodo necesita el tipo especificado para el resultado de la función (que debe coincidir con elTypeTokencreado). Dos versiones de este trabajo, como arriba o:Para facilitar la creación
TypeToken, puede crear una función auxiliar, que debe estar en línea para que pueda usar parámetros de tipo reificado :Que luego se puede usar de cualquiera de estas formas:
Y todo el proceso se puede envolver en una función de extensión para la
Gsoninstancia:Para que puedas llamar a Gson y no preocuparte por
TypeTokennada:Aquí Kotlin está usando la inferencia de tipos de un lado de la asignación o del otro, y genéricos reificados para que una función en línea pase a través del tipo completo (sin borrado), y lo usa para construir un
TypeTokeny también hacer la llamada a Gsonfuente
Gson().fromJson<kotlin.List<Turns>>(pref.turns)Gson()o simplementeGsoncomo si fuera estática? Necesitas el primero, una instancia.Otra opción (no estoy seguro de que se vea más elegante que las otras) podría ser una llamada como esta:
Entonces estás usando el trazador de líneas de clase uno de Java Array en lugar de "Kotlin puro".
fuente
Es mi forma de analizar la matriz de datos en kotlin.
fuente
Solía algo como esto para convertir
TastringyStringvolver aTutilizarGson. No es exactamente lo que estás buscando, pero por si acaso.fuente
Esto también funciona y es más sencillo
fuente
Kotlin
generic reified functionde Gson deserializar paraArrayList<T>usar este códigofuente