johnny_crq
johnny_crq

Reputation: 4391

Android Kotlin Moshi Custom Json Adapter

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:

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:

Upvotes: 0

Views: 1759

Answers (1)

l0v3
l0v3

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

Related Questions