Android Kotlin Moshi Custom Json Adapter

时间:2016-10-26 18:00:25

标签: android kotlin moshi

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

  • 中的某些值

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 个答案:

答案 0 :(得分:1)

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

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

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