好的,我有以下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>?
)
我想写一个海关deserialiser,所以最终的对象将是这样的:
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中的某些值
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种转换对象 .
1 回答
我认为,递归是处理
list(add(fromJson(it))
的正确方法,主要问题在于结构内部 . 结构本身是递归的 . 正确的方法是展平结构和引用另一种对象类型 .大约第二,这也是结构不良的问题 . 您可以通过继承来解决这个问题 . 然后检查目标类型本身 .