Android Kotlin Moshi Custom Json Adapter

Ok, tengo el siguiente Json Pojo:

data class JCategory( val id: Int, val name: String, val image: String?, val color: String?, val categories: List<JCategory>?, val products: List<JProduct>? ) 

Y quiero escribir un deserializador de aduanas, por lo que el object final se verá así:

 data class Category( val id: Int, val name: String, val image: String?, val color: String?, val list: List<Any> ) 

Básicamente, las asignaciones son:

  • JCategory -> Category

  • JProduct -> Prod1 / Prod2 basado en algún valor dentro de JProduct

Las lists JCategory dos se unirán en 1, en el que contendrá más JCategory plus Prod1 / Prod2.

¿Es esta una forma válida y eficiente de mapear los datos en este adaptador de acuerdo con Moshi?

 @FromJson fun fromJson(category: JCategory): CategoryProduct { val prods = category.products val cats = category.categories val list = mutableListOf<Any>() if (prods != null && prods.size > 0) { prods.forEach { list.add(if (it.isMain == 1) { P1( ... ) } else { P2( ... ) }) } } if (cats != null && cats.size > 0){ cats.forEach { list.add(fromJson(it)) } } return CategoryProduct( category.id, category.name, category.image.emptyToNull(), parsedColor, category.parentId, list ) } 

Tenga en count que tengo una JCategory y dentro de una list del mismo object, así que pensé que el Adaptador analizaría esto automáticamente pero no es así. Así que probé list.add(fromJson(it)) y funcionó.

Entonces mis preguntas son:

  • es list.add(fromJson(it)) la forma correcta de manejar casos como este?
  • ¿Cómo puedo mapear un object a otro / otro basado en alguna propiedad dentro de él? The fromJson solo puede devolver 1 tipo de object transformado.

Creo que la recursión es la forma correcta de manejar la list(add(fromJson(it)) , el problema principal está dentro de la estructura. La estructura en sí es recursiva. La forma correcta es aplanar la estructura y hacer reference a otro tipo de object.

En segundo lugar, este es también un problema que viene con una mala estructura. Puede resolver esto por padre común a través de la inheritance. Luego revisa el tipo de objective en sí.

 interface X { } data class A : X { } data class B : X { } @FromJson fun fromJson(json: C): X { } 
  • Moshi: se esperaba una Clase, Tipo Paramétrico o Tipo de Armario Genérico, pero <nulo> es de tipo nulo
  • Deserializar un campo que puede ser uno de dos types de datos utilizando Moshi