【问题标题】:Android Kotlin Moshi Custom Json AdapterAndroid Kotlin Moshi 自定义 Json 适配器
【发布时间】:2017-03-09 05:25:19
【问题描述】:

好的,所以我有以下 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 -&gt; Category

  • JProduct -&gt; 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 种类型的转换对象。

【问题讨论】:

    标签: android kotlin moshi


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 2017-02-08
      • 2018-06-17
      • 1970-01-01
      • 2021-04-01
      • 2020-12-16
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多