Android Kotlin Moshi自定义Json适配器

好吧,所以我有以下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>? ) 

我想写一个海关反序列化器,所以最终的对象将如下所示:

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

基本上,映射是:

  • JCategory -> Category

  • JProduct -> Prod1 / Prod2基于JProduct -> Prod1 / Prod2的某个值

JCategory两个列表将联合为1,其中将包含更多的JCategory和Prod1 / Prod2。

根据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 ) } 

请注意,我有一个JCategory和同一个对象的列表,所以我认为适配器会自动解析,但它不。 所以我尝试list.add(fromJson(it)) ,它的工作。

所以我的问题是:

  • list.add(fromJson(it))处理这种情况的正确方法?
  • 我如何根据内部的一些属性将对象映射到另一个对象? fromJson只能返回1种类型的变换对象。

我认为,递归是处理list(add(fromJson(it))正确方式list(add(fromJson(it)) ,主要问题是在结构内部,结构本身是递归的,正确的方法是将结构和引用展平到另一个对象类型。

关于第二,这也是结构不好的问题。 你可以通过继承来解决这个问题。 然后检查目标类型本身。

 interface X { } data class A : X { } data class B : X { } @FromJson fun fromJson(json: C): X { }