Reputation: 4391
Ok so i have the following 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>?
)
And i want to write a customs deserialiser, so the final object will look like this:
data class Category(
val id: Int,
val name: String,
val image: String?,
val color: String?,
val list: List<Any>
)
Basically, the mappings are:
JCategory -> Category
JProduct -> Prod1 / Prod2
based on some value inside JProduct
The JCategory two lists will be joint into 1, in which will contain more JCategory plus Prod1/Prod2.
Is this a valid and efficient way of mapping the data in this adapter according to 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
)
}
Notice that i have a JCategory and inside a list of the same object,
so i thought the Adapter would parse this automatically but it doesn't. So i tried list.add(fromJson(it))
and it worked.
So my questions are:
list.add(fromJson(it))
the proper way of handling cases like this?Upvotes: 0
Views: 1759
Reputation: 973
I think, recursion is proper way of handling list(add(fromJson(it))
, the main problem is inside the structure. The structure itself is recursive. Proper way is to flatten structure & referencing to another object type.
About second, this is also problem which comes with bad structure. You can solve this by common parent via inheritance. Then check target type itself.
interface X { }
data class A : X { }
data class B : X { }
@FromJson fun fromJson(json: C): X { }
Upvotes: 1