Android Kotlin Moshi自定义Json适配器
好吧,所以我有以下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 -> Prod1 / Prod2
的某个值
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种类型的变换对象。
我认为,递归是处理list(add(fromJson(it))
正确方式list(add(fromJson(it))
,主要问题是在结构内部,结构本身是递归的,正确的方法是将结构和引用展平到另一个对象类型。
关于第二,这也是结构不好的问题。 你可以通过继承来解决这个问题。 然后检查目标类型本身。
interface X { } data class A : X { } data class B : X { } @FromJson fun fromJson(json: C): X { }
- 为什么Kotlin插件为Android项目添加了kotlin-stdlib-jre7(不是kotlin-stdlib)参考
- Kotlin lateinit属性,NPE危险?
- 未解决的参考DaggerApplicationComponent
- 有没有什么办法来覆盖Kotlin中扩展类的setter属性
- 在房间中更改Flowable <List <Obj1 >>为Flowable <List <Obj2 >>
- 在for循环中创建MediaPlayer
- 在Dagger 2中提供方法
- 即时应用基本功能的Application.onCreate()永远不会被调用
- 处理程序()postDelay无法访问此Kotlin代码,如何解决它?