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>?
)

我想写一个海关反序列化器,所以最终的对象看起来像这样:

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 种类型的转换对象。
4

1 回答 1

1

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

其次,这也是结构不好的问题。您可以通过继承由共同父级解决此问题。然后检查目标类型本身。

interface X { }
data class A : X { }
data class B : X { }
@FromJson fun fromJson(json: C): X {  }
于 2017-04-04T20:27:50.420 回答