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>() {}.type
Esto resuelve el problema:
La primera línea crea una expresión de objeto que desciende
TypeToken
y luego obtiene JavaType
de eso. Entonces elGson().fromJson
método necesita el tipo especificado para el resultado de la función (que debe coincidir con elTypeToken
creado). 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
Gson
instancia:Para que puedas llamar a Gson y no preocuparte por
TypeToken
nada: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
TypeToken
y también hacer la llamada a Gsonfuente
Gson().fromJson<kotlin.List<Turns>>(pref.turns)
Gson()
o simplementeGson
como 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
T
astring
yString
volver aT
utilizarGson
. 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 function
de Gson deserializar paraArrayList<T>
usar este códigofuente