Home Articles

Android Kotlin Moshi Custom Json适配器

Asked
Viewed 1820 times
0

好的,我有以下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 Answer

  • 1

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

    大约第二,这也是结构不良的问题 . 您可以通过继承来解决这个问题 . 然后检查目标类型本身 .

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

Related