Android Kotlin Moshi 自定义 Json 适配器

Android Kotlin Moshi Custom Json Adapter

好的,所以我有以下 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 两个列表将合并为 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)),主要问题出在结构内部。结构本身是递归的。正确的方法是展平结构并引用另一个 object 类型。

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

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