当前位置: 首页 > 知识库问答 >
问题:

Android Kotlin Moshi定制Json适配器

况博容
2023-03-14

好了,我有了以下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 two列表将合并为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个答案

    洪季萌
    2023-03-14

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

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

    interface X { }
    data class A : X { }
    data class B : X { }
    @FromJson fun fromJson(json: C): X {  }
    
     类似资料:
    • 问题内容: Ember.js REST适配器期望JSON返回为: 但是我的API返回的数据 没有根元素 : 是否可以自定义REST适配器,使其接受我的JSON数据?现在,它显示“ 断言失败:您的服务器返回了一个带有键0的哈希,但是您没有映射 ” 更新: 根据下面的Sherwin Yu的答案,这是我想出的,到目前为止似乎仍然有效:https : //gist.github.com/richardka

    • 英文原文:http://emberjs.com/guides/models/customizing-adapters/ 在Ember Data中,处理与后台数据仓库通信的逻辑是通过Adapter来完成的。Ember Data适配器内置了一些关于REST API的假定。如果后台的实现与Ember Data假定的惯例不同,那么通过扩展缺省的适配器可能很容易的实现。 有时因为一些原因需要自定义适配器,例

    • Ember.js适配器指定如何在后端数据存储中保存数据,例如URL格式和REST API标头。 默认的Ember适配器包含一些REST API的内置假设。 这些假设有助于更轻松,更好地构建Web应用程序。 可以使用以下命令创建适配器 - ember generate adapter adapter-name 运行上面的命令时,它将显示以下行 - import DS from 'ember-dat

    • 主要内容:创建自定义适配器,注册自定义适配器,使用适配器Gson使用其内置适配器执行对象的序列化/反序列化。 它也支持自定义适配器。 让我们来讨论如何创建一个自定义适配器以及如何使用它。 创建自定义适配器 通过扩展类并传递目标类型的对象来创建自定义适配器。 重写读写方法分别执行自定义的反序列化和序列化。 注册自定义适配器 使用注册自定义适配器并使用创建一个Gson实例。参考以下实现代码 - 使用适配器 Gson现在将使用自定义适配器将Json文本转换为

    • 我已经创建了一个绑定适配器来显示毕加索的图片,但它不工作。我有以下错误: 发现数据绑定错误。****/数据绑定错误****Msg:在Android.Widget.ImageView上找不到参数类型为java.lang.String的属性'app:loadPicture'的设置器。文件:/home/groupevsc.com/mathieu_labar/documents/projects/andr

    • 将 HTTP 参数转换成一个函数参数的过程是一个典型适配过程,执行这个过程的对象被称为适配器了。 Nutz.Mvc 提供了 org.nutz.mvc.HttpAdaptor 接口,隔离了这种行为。 在每一个入口函数上,你都可以通过注解 @AdaptBy 来声明如何适配 HTTP 参数。当然,你 没必要在每一个入口函数上都声明,在子模块类上声明,或者在整个应用的主模块上声明均可。 如何使用适配器?